我希望在管理员界面中公开一些(特定于应用程序的)设置,以便用户可以轻松更改它们,而且不必重新启动Django。
我该如何实现?
我查看了http://djangopackages.com/grids/g/live-setting/上的应用程序(顺便说一句,django-constance最有吸引力),但实际上,所有这些应用程序都是将值存储在数据库中,提供Web界面以进行更改并缓存。前两个功能已经内置于Django中,是吗?
我看到的最大缺点是,这些应用程序都不能代替旧位置(settings.py)中的设置,并要求我迁移到它们的记法,并且通常需要添加另一个上下文处理器来在模板中访问它们。
我可不可以只是这样做呢?
- 创建一个用于我的设置的模型(这使我拥有各种类型和验证)
- 实例化一个这样的对象以保存我的设置(这允许用户在管理员界面中编辑它们)-我可以像为其他模型一样导出默认值作为fixture
- 包装settings.py,以便它为我的设置执行数据库查询- http://www.loose-bits.com/2011/04/extending-django-settings-with-derived.html
从我当前天真的观点来看,我只看到以下缺点:
- 添加或更改可用设置需要模式迁移(south)-我可以接受这一点。
- 我有一个可能有多个实例但实际上只需要一个单例的模型。-在某些情况下,这实际上可能是一个有用的功能。
- 性能/缓存:查看http://code.djangoproject.com/svn/django/trunk/django/conf/,我必须在设置包装器和/或模型中放入一些巧妙的代码,以便模型更改会清除或更新缓存值。-看起来并不像火箭科学那么复杂。
这样难道不是最好的两全其美的方式吗- 在运行时使用管理员(拥有其所有优点)、数据库后端、缓存,而且我的settings.USED_TO_BE_IN_SETTINGS_DOT_PY无需任何更改。我是否遗漏了什么?
django.conf.settings
,那么除了篡改 Django 本身之外,你无法实现你想要的功能。你应该迁移至少调用设置(代码迁移)以使用外部库提供的设置对象。 - Torsten Engelbrechtfrom django.conf import settings
,它将会产生与之前相同的效果,也就是从django/conf/init.py中导入settings对象,这只是一个包装器,用于包装你的项目设置文件。它并不打算根据代码包装另一个对象。再次强调:除非你侵入Django本身。 - Torsten Engelbrecht