我正在尝试将变量(浏览器变量)传递给我的应用中的所有模板。关于如何让它发挥作用的任何建议?
查看:
def browser(request):
primary_cat_list = Categories.objects.order_by("category")
subcat_list = SubCategories.objects.order_by("sub_category")
product = Productbackup.objects.order_by("website")
browser = list(chain(primary_cat_list, subcat_list, product))
return render_to_response('reserve/templates/base.html', locals(), context_instance=RequestContext(request))
模板:
{% for prod in browser %} {{ prod }}, {% endfor %}
答案 0 :(得分:13)
您,我的朋友,正在进入上下文处理器市场。
来自a blog entry来自一位远比我更聪明,更博学的技术作家:
什么是模板上下文处理器?
Django的上下文处理器是一种允许您为模板提供数据和回调的工具。
您可以通过以下两种方式之一完成此操作:
- 基于个人请求:将自定义
Context
值传递给render_to_response()
来电- 全局:通过创建一个接受
HttpRequest
对象作为输入的上下文处理器方法,并返回有效负载或回调,然后 在settings.py
注册上下文处理器,然后使用内置render_to_response()
属性提供RequestContext
来电 而不是您自己的(当然,您可以随时扩展RequestContext
以在单个请求的基础上添加更多数据。)如果将数据传递给模板的方法对你来说听起来很荒谬和混淆,那么你并不孤单。这种简单操作所涉及的复杂性是没有根据的,适得其反,但每个系统都有其缺点。
官方文件在这里:
https://docs.djangoproject.com/en/dev/ref/templates/api/
所以,但是,我一直在用Django编程一段时间,而且我之所以喜欢解决问题的原因之一是因为它的复杂性几乎是拜占庭式的,而不是以霸气的方式。它有大量的geegaws和doodads可能不会立即显得有用;当你需要它们时,它们中的每一个都非常方便,如果不是这样的话,它将会不受欢迎。
这里的结果是:上下文处理器就是其中的一个很好的例子。是。
答案 1 :(得分:4)
目前您正在传递locals()
作为变量范围,其中应包括browser
,但我发现使用locals()
非常难看。
我个人总是喜欢这样的模式:
def browser(request):
context = RequestContext(request)
primary_cat_list = Categories.objects.order_by("category")
subcat_list = SubCategories.objects.order_by("sub_category")
product = Productbackup.objects.order_by("website")
browser = list(chain(primary_cat_list, subcat_list, product))
context['browser'] = browser
return render_to_response('reserve/templates/base.html', context_instance=context)
答案 2 :(得分:4)
我可以举一个我的代码示例,它运行正常。这是名为context_processors.py
的文件:
def base(request):
user = request.user
#======================
#Login form
#=====================
# here is the code for login user or check if he is logged in already
return {
'user': user,
}
那就是我的base.html的一部分(我使用我所有页面的模板)
{% if user.username %}
<h3>
Welcome {{ user.username }}
</h3>