1

我有一个 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 问题似乎是相关的,但我认为它没有得到完全回答。

谢谢!

4

3 回答 3

4

我已经尝试过 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":""};
于 2014-07-31T19:34:00.533 回答
1

理想情况下,settings.py必须很少访问,因为每次访问都包括公开重要数据(例如数据库密码)。所以存储额外设置的最佳位置绝对是一个数据库表——一个两列的表,带有设置键和实际设置数据就足够了。

于 2011-02-02T15:56:27.663 回答
0

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

数据库设置应用程序...

于 2011-02-02T16:29:54.280 回答