我有一个导航栏,当用户未登录时显示“登录”和“注册”。当用户登录时,导航栏将显示用户的姓名和他收件箱中的邮件数量
问题是导航页面大约有50页,因此大约有50个视图函数需要获取用户信息并将其发送到模板。如果我想稍后改变它,那将是一种痛苦!
例如,这是一个示例视图:
def index(request):
user = request.user
...
return render_to_response("page.html", {'user': user})
我必须每次使用导航栏将有关用户的信息发送到任何页面,因为我的导航栏包含代码:
{% if user %}
...
{% else %}
....
{% endif %}
有更简洁的方法吗?
编辑:此外,我有一个UserProfile模型,我想将其发送到模板。有没有办法做到这一点?
答案 0 :(得分:2)
您可以像DrTyrsa建议的那样创建自定义模板标记,也可以创建context processor。
答案 1 :(得分:2)
最简单的方法是将django.contrib.auth.context_processors.auth
包含在TEMPLATE_CONTEXT_PROCESSORS
的{{1}}配置中。如上所述in the docs,它会在您的模板上下文中添加settings.py
和user
变量,以便您直接访问当前用户。
perms
的默认配置不是这个(在Django 1.3中):
TEMPLATE_CONTEXT_PROCESSORS
因此,上下文处理器应该已处于活动状态,您应该能够访问模板中的("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.contrib.messages.context_processors.messages")
变量,而无需在视图中返回它。
在您的视图中,您只需使用render
快捷方式,该快捷方式将负责创建所需的RequestContext实例:
user
答案 2 :(得分:0)
答案 3 :(得分:0)
为什么您需要将用户发送到每个视图,HttpRequest包含用户,您可以在登录时轻松地在模板中访问它。
另一种解决方案是,将用户保存在sessions中,并在任何视图或模板中访问它。