在Django中定义常量

24 投票
7 回答
37893 浏览
提问于 2025-04-16 06:13

我想在Django项目中定义一些常量。比如说,定义一个叫做 MIN_TIME_TEST 的常量。

我希望能在两个地方使用这个常量:在我的Python代码里,以及在任何模板中。

那么,最好的做法是什么呢?

编辑: 为了更清楚,我知道有模板上下文处理器,也知道可以把常量放在settings.py或者其他文件里,然后导入使用。

我的问题是,如何把这两种方法结合起来,同时又不违反“不要重复自己”的原则?根据目前的回答,我的想法是:

我想创建一个叫做global_constants.py的文件,里面放一系列常量(比如 MIN_TIME_TEST = 5)。我可以在任何模块中 import 这个文件来获取常量。

但是现在,我想创建一个上下文处理器,自动返回所有这些常量。我该如何做到这一点,而不需要像John Mee的回答那样再在字典里列出它们呢?

7 个回答

3

可以考虑把它放到你应用的settings.py文件里。当然,要在模板中使用它,你需要像其他普通变量一样,把它提供给模板。

6

为了更好地理解其他人的回答,这里有一个简单的方法来实现这个功能:

在你的设置文件中:

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
19

我觉得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)

撰写回答