base.html
用作所有其他页面的基本模板。 base.html
有导航栏,在导航栏中,我想显示用户收到的邮件数量。因此,我需要{{number_of_messages}}
中的变量base.html
。
但是,我应该如何将此变量传递给它?每个模板都扩展base.html
并由函数呈现。我不认为在所有函数中返回number_of_messages
是一个好方法。有没有更好的方法来实现这个?如何将此变量传递给所有模板?
答案 0 :(得分:12)
看看:
https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext
只要:
render
快捷方式(或者使用RequestContext
来表示您的回复)django.contrib.auth.context_processors.auth
设置as it is by default)TEMPLATE_CONTEXT_PROCESSORS
...然后您在模板中将当前请求的User
(或AnonymousUser
)实例设为{{ user }}
...我猜从那里您可以访问消息的数量直接?
或许您正在使用Django的messages framework?
这附带了它自己的上下文处理器(只要您使用render
或RequestContext
)就可以在模板中创建{{ messages }}
var(包含当前用户的消息) 。对于“消息数量”,您可以执行{{ messages|length }}
如果这些内置选项都不能满足您的需求,您可以:
make your own template context processor将针对每个请求运行,并为所有模板提供其他变量(使用RequestContext
呈现时)
make your own template tag只能在需要的地方使用...当然,如果在base.html
中使用了此类模板,并且所有模板都从base.html
继承,那么它仍将继续运行每页都有。
答案 1 :(得分:8)
您可以使用标签。
#myproject/myproject/templatetags/tags.py
from django import template
register = template.Library()
@register.simple_tag
def number_of_messages(request):
return _number
在您的Base.html中
{% load tags %}
{% number_of_messages request %}
答案 2 :(得分:3)
如果您希望变量真正所有视图,那么自定义模板上下文处理器可能是最佳选择。
https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext
如果您只想在某些视图中使用该变量,那么您可以将这些视图调用为填充公共变量的常用函数,如下所示:
def some_view(request):
params = _common_params(request)
params.update({
# params specific to .some_view
})
return render_to_response('path/to/template, params)
或者像这样创建一个自定义装饰器:
from functools import wraps
def render_with_params():
def _inner(view_method):
def _decorator(request, *args, **kwargs):
params = _common_params(request)
(template_path, view_params) = view_method(request, *args, **kwargs)
params.update(view_params)
return render_to_response(template_path, params, context_instance=RequestContext(request))
return wraps(view_method)(_decorator)
return _inner
@render_with_params()
def some_view(request):
params = { ... }
return ('path/to/template', params)
答案 3 :(得分:3)
我发现在django中将变量传递到基本模板的最简单步骤是添加一个context_processor.py文件,如下所示:
在您的应用中,创建context_processors.py并声明变量,例如:
# context_processors.py
def message_processor(request):
if request.user.is_authenticated:
no_msgs = request.user.profile.msgs
else:
no_msgs = 0
return {
'messages' : no_msgs
}
然后在您的settings.py文件中的TEMPLATES中注册您的过程:
TEMPLATES = [
{
...
'context_processors': [
...
# custom
'appname.context_processors.message_processor',
],
},
},
]
然后您将可以在应用程序中的任何位置获取该变量,如下所示:
{{ messages }}