JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Как в Django организовать индивидуальные настройки проекта, сменяемые через админку?

Существуют разного рода проекты.
Один из них представляет своего рода CRM, другой производственный интернет магазин (это когда кроме вида изделий, может задаваться ещё и индивидуальный размер), третий проект, где кроме интернет магазина, есть ещё презентационный лендинг.
По факту, не суть какой проект это может быть, в каждом из них существуют единичные настройки, которые время от времени нужно менять и клиент (заказчик проекта) хочет это делать самостоятельно через админку.

Часть настроек участвует лишь в визуальной составляющей.
Например:
  • вкл/выкл карусельки (слайдера)
  • заменить ссылку на картинку на главной
  • заменить ссылку на видео-ролик с ютуба
  • и т.п.


Но другая часть настроек участвует в формулах рассчёта (которое находятся во вьюхах (views.py))
  • Процент цены для клиента
  • Процент цены для дилера
  • Банковские реквизиты (БИК, корсчёт и т.п.)
  • и т.п.


Все подобные настройки время от времени необходимо менять. И есть проекты, где нужно менять регулярно (чуть ли не раз в неделю). Необходимость в такого рода инструменте назрела давно. Но как это реализовать, может есть какие-то идеи или даже "батарейки"?

С уважением.
  • Вопрос задан
  • 36 просмотров
Пригласить эксперта
Ответы на вопрос 2
fox_12
@fox_12 Куратор тега Django
Расставляю биты, управляю заряженными частицами
Делаете синглтон модель - где настройки и храните. Меняете просто через админку.
К примеру такую:
class CachedSingletonModel(models.Model):

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        self.pk = 1
        super().save(*args, **kwargs)
        self.set_cache()

    def delete(self, *args, **kwargs):
        ''' Bypass delete method '''
        pass

    def set_cache(self):
        cache.set(self.__class__.__name__, self)

    @classmethod
    def load(cls):
        if cache.get(cls.__name__) is None:
            obj, created = cls.objects.get_or_create(pk=1)
            if not created:
                obj.set_cache()
        return cache.get(cls.__name__)


# создаете свою модель настроек
class Settings(CachedSingletonModel):
     ... определяете свои поля
     my_field = ...

# используете
mysettings = Settings.load()
mysettings.my_field
Ответ написан
Комментировать
Для себя я делал такое:
class Meta(models.Model):
    name = models.CharField('Имя', max_length=32, unique=True, )
    value = models.TextField('Значение', blank=True, )

    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('-id',)
        verbose_name = 'Опции'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


def set_option(option, value):
    return Meta.objects.update_or_create(name=option, defaults={'value': value}, )  # obj, created


def get_option(option, default=None):
    try:
        row = Meta.objects.get(name=option)
        return row.value
    except Meta.DoesNotExist:
        return default

Но вариант выше мне нравится тем, что есть кеширование, надо бы и мне как-то добавить его)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы