在Django中定义常量
我想在Django项目中定义一些常量。比如说,定义一个叫做 MIN_TIME_TEST
的常量。
我希望能在两个地方使用这个常量:在我的Python代码里,以及在任何模板中。
那么,最好的做法是什么呢?
编辑: 为了更清楚,我知道有模板上下文处理器,也知道可以把常量放在settings.py或者其他文件里,然后导入使用。
我的问题是,如何把这两种方法结合起来,同时又不违反“不要重复自己”的原则?根据目前的回答,我的想法是:
我想创建一个叫做global_constants.py的文件,里面放一系列常量(比如 MIN_TIME_TEST = 5
)。我可以在任何模块中 import
这个文件来获取常量。
但是现在,我想创建一个上下文处理器,自动返回所有这些常量。我该如何做到这一点,而不需要像John Mee的回答那样再在字典里列出它们呢?
7 个回答
可以考虑把它放到你应用的settings.py文件里。当然,要在模板中使用它,你需要像其他普通变量一样,把它提供给模板。
为了更好地理解其他人的回答,这里有一个简单的方法来实现这个功能:
在你的设置文件中:
GLOBAL_SETTINGS = {
'MIN_TIME_TEST': 'blah',
'RANDOM_GLOBAL_VAR': 'blah',
}
接下来,基于 John Mee 的上下文处理器:
def settings(request):
"""
Put selected settings variables into the default template context
"""
from django.conf import settings
return settings.GLOBAL_SETTINGS
这样可以解决代码重复的问题。
或者,如果你只是偶尔需要使用全局设置,并且想在视图中调用它们:
def view_func(request):
from django.conf import settings
# function code here
ctx = {} #context variables here
ctx.update(settings.GLOBAL_SETTINGS)
# whatever output you want here
我觉得Luper和Vladimir说的都对,但你需要两者结合才能满足你的需求。
虽然常量不一定要放在settings.py文件里,你可以把它们放在任何地方,然后从那个地方导入到你的视图、模型或模块代码中。有时候我会把它们放在
__init__.py
里,如果我不想让它们被当作全局变量使用的话。像这样的上下文处理器可以确保选定的变量在模板中是全局可用的。
def settings(request): """ Put selected settings variables into the default template context """ from django.conf import settings return { 'DOMAIN': settings.DOMAIN, 'GOOGLEMAPS_API_KEY': settings.GOOGLEMAPS_API_KEY, }
不过如果你刚接触django,这可能有点复杂;也许你只是想知道怎么把变量放到模板中...?
from django.conf import settings
...
# do stuff with settings.MIN_TIME_TEST as you wish
render_to_response("the_template.html", {
"MIN_TIME_TEST": settings.MIN_TIME_TEST
}, context_instance=RequestContext(request)