上下文处理器更适合处理更多动态对象数据 - 它们被定义为documentation中的映射,在许多帖子中它们被修改或传递给视图 - 它不会理解模板可能会失去对全局信息的访问,例如,您忘记在视图中使用专用的上下文处理器。数据全球定义为&,将视图耦合到模板。
更好的方法是定义一个自定义模板标签。通过这种方式:
- 模板不靠看法已经全球信息传递到他们
- 它的DRY-ER:定义全局设置的应用程序可以出口到很多项目,跨项目
消除公共代码
- 模板决定他们是否有机会获得全球信息,而不是视图功能
在下面的例子中我解决你的问题 - 在这个MIN_TIME_TEST可变载荷 - 和我经常要面对的问题,在装在我的环境c时更改的URL hanges。
我有4个环境 - 2开发和生产2:
- 开发:Django的Web服务器,网址:本地主机:8000
- 开发:Apache Web服务器:网址:sandbox.com - >解析为127.0.0.1
- PROD沙盒服务器,网址:sandbox.domain.com
- PROD服务器:网址:domain.com
我这样做对我的所有项目&将所有的url保存在一个文件global_settings.py中,以便从代码访问它。我定义了可以(可选)加载到任何模板的自定义模板标记{%site_url%}
我创建了一个名为global_settings的应用程序,并确保它包含在我的settings.INSTALLED_APPS元组中。
Django的模板编译成文字以告诉数据应该如何显示渲染()方法节点 - 我创建了一个基于传入的名字在我的global_settings.py returnning值呈现数据的对象
它看起来像这样:现在
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的内置设置更灵活.Debug = True/False标志。
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蟒蛇。我在这里的Django的应用程序被称为global_settings,所以我的目录结构如下:
/project-name/global_settings/templatetags/global_settings.py 等
最后的模板选择在全局设置与否是否加载,这对性能有益。将此行添加到您的模板中以公开在global_settings中注册的所有标记。潘岳:
{% load global_settings %}
现在,需要MIN_TIME_TEST或这些环境暴露只需安装此应用等项目=)
谢谢,这的确是我想去的方向。但请看我的澄清/其他问题,即我怎么能做你说的,而不必两次列出所有的常量? – 2010-10-28 14:26:04
将它们全部包装成字典,然后将该字典放入上下文中。您将通过点符号访问它们。例如:{{yourDict.yourConstant}} – 2010-10-28 23:36:41