Django: Разрешить администратору редактировать настройки всего сайта? - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть сайт Django, и я хотел бы разрешить редактировать в интерфейсе администратора несколько настроек для всего сайта:

ADMIN_EMAIL - email address for an administrative user
REMINDER_TEXT - email text for an email that the site will generate once a week

.

Что такоесамый разумный способ сделать это?Должен ли я хранить эти значения в settings.py или где-нибудь в базе данных?

Этот предыдущий вопрос SO, похоже, связан , но я не думаю, что на него когда-либо был дан полный ответ.

Спасибо!

Ответы [ 3 ]

1 голос
/ 31 июля 2014

Я пробовал использовать dbsettings (а также его более новую версию на github), и они полезны - но слишком тяжелы для моих нужд.Вместо этого я реализовал более простой метод.Я сделал это с помощью JSONField (из Postgres 9.3) - но вы могли бы предпочесть использовать TextField (используйте max_length = 1000 или что-то подобное), поскольку людям проще объяснить, как вводить строку вместо JSON:

1) Сначала создайте свою собственную модель настроек (возможно, в core / models.py):

class Setting(models.Model):
    """
    Model for site-wide settings.
    """
    name = models.CharField(max_length=200, help_text="Name of site-wide variable")
    value = JSONField(null=True, blank=True, help_text="Value of site-wide variable that scripts can reference - must be valid JSON")

    def __unicode__(self):
        return self.name

2) Затем добавьте интерфейс администратора (в core / admin.py):

class SettingAdmin(admin.ModelAdmin):
    list_display = ['name', 'value']

admin.site.register(Setting, SettingAdmin)

3) Создайте и запустите миграцию:

python manage.py schemamigration core --auto
python manage.py migrate core

4) Добавьте к началу base.html:

<script type="text/javascript">
    //Auto-exported site-wide settings
    {% autoescape off %}var site_settings = {{ settings|safe|default:"{}" }};{% endautoescape %}
</script>

5) Создайте «инжектор», который добавляеткод для каждого запроса (вероятно, в core / contextprocessors.py)

from models import Setting
import json

def app_settings(request):
    """Global values to pass to templates"""
    settings_dict = dict()
    settings = dict()
    for obj in Setting.objects.all():
        settings[obj.name] = obj.value
    settings_dict['settings'] = json.dumps(settings)
    return settings_dict

5) Затем добавьте процессоры контекста на ваш сайт settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...,
    '<yourapp>.core.contextprocessors.app_settings',
)

6) Войдите в системусвою страницу администратора через браузер и создайте настройку:

http://yoursite/admin/core/setting/
Add a new setting, something like:
    cell_status_colors
with a value of: 
    ["green","red"] (note this has to be valid JSON, so use quotes around strings)

or:
    daily_header
with a value of:
    {"text":"Tomorrow only, free shipping!"}

7) И наконец, каждый из ваших файлов javascript должен иметь возможность вызывать их через стандартный JS:

var colors = site_settings.cell_status_colors || ["green","red"];
var msg_text = site_settings.daily_header || {"text":""};
1 голос
/ 02 февраля 2011

В идеале к settings.py нужно обращаться очень редко, потому что каждый доступ состоит в раскрытии важных данных (например, пароля БД). Поэтому лучшим местом для хранения дополнительных настроек, безусловно, является таблица базы данных - таблица из двух столбцов с ключом настроек и фактическими данными настроек.

0 голосов
/ 02 февраля 2011

Есть некоторые приложения, которые позволяют администраторам django определять и использовать некоторые настройки через весь сайт ... Одним из таких приложений (которые я использовал) является dbsettings ...

Приложение базы данных ...

...