我已经尝试过 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":""};