上下文处理器更适合处理更动态的对象数据——在
文档中它们被定义为一个映射,在许多帖子中,它们被修改或传递到视图中——这是因为模板可能会失去对全局信息的访问,例如,您忘记在视图中使用专门的上下文处理器。数据是全局的,这意味着视图与模板耦合。
更好的方法是定义一个自定义模板标签。这样做的好处有:
- 模板不依赖于视图传递全局信息
- 它更加DRY(不重复),定义全局设置的应用程序可以导出到许多项目中,消除跨项目的公共代码
- 模板决定它们是否有访问全局信息的权限,而不是视图函数
在以下示例中,我解决了您的问题——加载MIN_TIME_TEST变量——以及我经常遇到的问题,即在环境更改时加载URL。
我有4个环境——2个开发和2个生产环境:
- Dev: django-web服务器,url:localhost:8000
- Dev:apache web服务器:url:sandbox.com->解析为127.0.0.1
- Prod sandbox服务器,url:sandbox.domain.com
- Prod服务器:url:domain.com
我在所有项目中都这样做,并将所有URL保存在global_settings.py文件中,因此可以从代码中访问。我定义了一个自定义模板标签{% site_url%},它可以(可选)加载到任何模板中
我创建了一个名为global_settings的应用程序,并确保它包含在我的settings.INSTALLED_APPS元组中。
Django将模板文本编译为具有render()方法的节点,以告知如何显示数据——我创建了一个对象,通过根据传入的名称返回global_settings.py中的值来呈现数据。
它看起来像这样:
from django import template
import global_settings
class GlobalSettingNode(template.Node):
def __init__(self, settingname):
self.settingname = settingname;
def render(self, context):
if hasattr(global_settings, self.settingname):
return getattr(global_settings, self.settingname)
else:
raise template.TemplateSyntaxError('%s tag does not exist' % self.settingname)
现在,在global_settings.py中,我注册了一些标签:例如我的site_url和你的min_test_time。这样,当从模板调用{% min_time_test %}时,它将调用get_min_time_test,该函数解析为加载值=5。在我的例子中,{% site_url %} 将进行基于名称的查找,以便我可以同时保留所有4个URL并选择我正在使用的环境。这对我来说比仅使用Django内置的settings.Debug=True/False标志更加灵活。请注意保留HTML标记。
from django import template
from templatenodes import GlobalSettingNode
register = template.Library()
MIN_TIME_TEST = 5
DEV_DJANGO_SITE_URL = 'http://localhost:8000/'
DEV_APACHE_SITE_URL = 'http://sandbox.com/'
PROD_SANDBOX_URL = 'http://sandbox.domain.com/'
PROD_URL = 'http://domain.com/'
CURRENT_ENVIRONMENT = 'DEV_DJANGO_SITE_URL'
def get_site_url(parser, token):
return GlobalSettingNode(CURRENT_ENVIRONMENT)
def get_min_time_test(parser, token):
return GlobalSettingNode('MIN_TIME_TEST')
register.tag('site_url', get_site_url)
register.tag('min_time_test', get_min_time_test)
请注意,为了使其正常工作,django期望global_settings.py位于Django应用程序下的一个名为templatetags的python包中。我的Django应用程序在这里称为global_settings,因此我的目录结构如下:
/project-name/global_settings/templatetags/global_settings.py
等等。
最后,模板选择是否加载全局设置是有益的性能优化。将以下行添加到您的模板中,以公开在global_settings.py中注册的所有标签:
{% load global_settings %}
现在,需要MIN_TIME_TEST或这些环境的其他项目只需安装此应用程序即可 =)