在Django中,设置存储在settings.py文件中。该文件是代码的一部分,并进入存储库。只有开发人员才能处理这个文件。管理员处理模型,数据库中的数据。这是非开发人员编辑的数据,站点访问者在模板中看到的数据。
问题是,我们的网站和许多其他网站都有许多设置选项,应该由非开发人员编辑。我们讨论的是独立的站点范围常量,它们在数据库中确实没有位置。将它们放入数据库将导致许多无意义的查询。缓存可以缓解这种情况,但是处理settings.py文件中单行可以完成的操作似乎不必要地复杂。
我注意到this dbsettings app,但它已经过时且没有维护。我还注意到django电子商务应用程序Satchmo包含了这个dbsettings应用程序的用例特定分支。我们可以在我们的网站上构建类似的东西,一个将一些设置作为键/值对存储在一个数据库表中的应用程序,但它看起来确实是错误的方法。为什么在不属于那里的数据库中添加一些内容只是为了让非开发人员更容易编辑?
我们在Django网站上有一个站点范围设置列表,我们希望非开发人员管理员可以编辑这些设置。解决这个问题的最佳方式是什么?
答案 0 :(得分:6)
像dbsettings这样的东西(正如你所提到的)似乎是要走的路。来自该项目的reasons for existence:
并非所有设置都属于
settings.py
,因为它有一些 特别限制:
设置是项目范围的。这不仅要求应用程序混乱
settings.py
,但也增加了命名的机会 冲突。在整个Django实例中,设置是不变的。他们不可能 在不重新启动应用程序的情况下进行了更改。
设置需要程序员才能进行更改。这甚至是真的 如果该设置对其他任何事物没有任何功能影响。
如果dbsettings不适合你,那么实现你自己的,或分叉它。它似乎不太费劲。
答案 1 :(得分:6)
我实际上是dbsettings的忠实粉丝,并且意味着发布我的补丁,它可以修补它以使用Django 1.1(实际上并不是一个很大的变化)。看起来有人有updated it already。
然而,你可能是对的,这对你所需要的东西来说太过分了。我之前做过的一件事是在settings.py的末尾添加一行,用于导入和解析YAML文件。 YAML是一种简单的标记语言,最基本的只是KEY: VALUE
...
CONSTANT1: MyValue
CONSTANT2: Anothervalue
如果你把它放在某个地方,编辑可以访问它,那么在settings.py结束时你就可以了:
import yaml
try:
globals().update(yaml.load(open('/path/to/my/yaml/file.yml')))
except:
pass
您需要Python YAML库来解析YML文件。
这种方法的缺点是你需要重新启动Apache才能让它接收更改。
编辑添加构建可编辑此文件的前端并提供运行脚本以重启Apache的按钮并不是特别困难。
答案 2 :(得分:1)
如果必须避免重新启动服务器,那么设置的逻辑位置就是Dominic和Daniel所说的数据库,但每次更新时都需要使缓存的设置对象无效。
看起来可以使用Django的low level cache API在缓存中重新设置值。通过这些调用,您可以实现所有目标:
cache.set('settings', local_settings)
cache.add('settings', local_settings)
local_settings = cache.get('settings')
cache.delete('settings')
答案 3 :(得分:0)
如何将sitesettings.py(或其他)放在管理员可以访问的位置,然后在settings.py中
from sitesettings import *
这似乎很简单,但我可能误解或过度简化了你的问题:)
答案 4 :(得分:0)
models.py
class Setting(models.Model):
"""Global settings for app"""
name = models.CharField(max_length=100, null=False, blank=False)
value = models.CharField(max_length=100, null=False, blank=False)
def __str__(self):
return self.name
admin.py
from YOUR_APP.models import Setting
class SettingAdmin(admin.ModelAdmin):
list_display = (
'name',
'value',
)
admin.site.register(Setting, SettingAdmin)
extras.py
@register.filter
def get_setting(name):
setting = Setting.objects.get(name=name)
return setting.value
模板.html
{% if 'setting_name'|get_setting == 'true' %}
Display your Feature
{% endif %}