Конфигурация сайта в django-admin - PullRequest
8 голосов
/ 25 марта 2012

Мой сайт имеет несколько глобальных конфигураций. Например, «адрес smtp-сервера», «адрес компании» и т. Д.

Конечно, я могу:

  1. Создайте переменную в settings.py и используйте ее в шаблонах и приложениях;
  2. Создайте модель (например, Configuration) и запишите в нее все необходимые поля.

Если я использую первый способ, я не могу дать доступ для изменения этих полей в django-admin.

Если я использую секунды, это не очень хорошее решение, потому что везде в коде я буду использовать model_name.objects.get(id=1), и мне нужен только один экземпляр. Модели были созданы для других задач.

Как я могу решить эту проблему?

Ответы [ 3 ]

7 голосов
/ 25 марта 2012

Это то, что я сделал. Возможно, это не самое оптимальное решение, но оно работает для меня.

  1. Создайте модель конфигурации и выполните все обычные действия, как в вашей точке 2. Создайте функцию (скажем, в configuration.view), которая будет извлекать и возвращать значения конфигурации в формате dict.

  2. Теперь в вашем settings.py импортируйте вашу функцию и установите возвращаемый dict в переменную settings.py: CONFIG = configuration.view.get_config()

  3. Создайте процессор контекста шаблона, который будет устанавливать этот CONFIG dict в контексте шаблона.

    def init_site_settings(request):
        return settings.CONFIG
    
  4. Добавьте этот контекстный процессор к вашему TEMPLATE_CONTEXT_PROCESSORS

  5. Теперь вы можете использовать параметры конфигурации в шаблонах как {{my_config_key}}

Надеюсь, это поможет.

3 голосов
/ 25 марта 2012

Посмотрите на http://www.djangopackages.com/grids/g/live-setting/ из моего аналогичного вопроса Изменение настроек Django во время выполнения

Относительно записи id = 1, а) вы можете определить соответствующий атрибут в вашем менеджере https://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methods б) да, это все еще запрос к базе данных - проверьте https://github.com/disqus/django-modeldict/ для подхода с отложенным доступом и кэшированием.

0 голосов
/ 25 марта 2012

Для вашего варианта 2 жестко закодированный идентификатор = 1 ужасен, используйте get () напрямую.Таким образом, вы можете использовать:

get_conf = lambda: model_name.objects.get()

Также есть другие приложения для требований, такие как http://bitbucket.org/bkroeze/django-livesettings/.Вы можете проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...