Django:允许管理员用户编辑站点范围的设置?

时间:2011-02-02 15:41:13

标签: django django-settings

我有一个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中,还是存储在数据库中的某个位置?

This previous SO question seems to be related,但我认为它没有得到完全回答。

谢谢!

3 个答案:

答案 0 :(得分:1)

理想情况下,settings.py必须很少访问,因为每次访问都包含暴露重要数据(例如db密码)。因此,存储额外设置的最佳位置绝对是数据库表 - 一个双列表,使用设置键和实际设置数据就足够了。

答案 1 :(得分:1)

我已经尝试过dbsettings(以及它在github上的新分叉),它们很有用 - 但对我的需求来说有点太重了。相反,我实现了一个更简单的方法。我使用JSONField(来自Postgres 9.3)来做 - 但你可能更喜欢使用TextField(使用max_length = 1000或somesuch),因为它更容易向人们解释如何输入字符串而不是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":""};

答案 2 :(得分:0)

有一些应用程序允许django管理员通过站点范围定义和使用某些设置...其中一个这样的应用程序(我使用过)是dbsettings ...

dbsettings applicaton...