我有一个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,但我认为它没有得到完全回答。
谢谢!
答案 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 ...