我有一个使用Postgres 9.3的Django 1.6应用程序。网站上每个视图的每个模板都将扩展两个模板中的一个或另一个。一个模板" anon.html"将在未登录的用户可以查看的所有页面上显示最小页面标题(例如,在用户尚未拥有帐户的注册过程中)。第二个" auth.html"模板在登录用户查看页面时显示的每个模板中进行扩展。此模板显示一个标题,其中包含"显示成员","消息","帐户"等等。任何呈现此模板的视图都将以@login_required装饰器开头。每当用户请求一个要求他们登录的页面时(换句话说),当我渲染" auth.html"时,我如何执行Django数据库查询?模板?如果用户有新消息,我希望能够更改"消息"在auth.html模板标题中链接以说明"新消息"。此查询必须在呈现页面的其余部分之前运行,并且我不想将查询放在每个视图中。
谢谢!
答案 0 :(得分:2)
假设您正在使用django.core.context_processors.auth
context processor,您的模板可以访问user
对象。
因此,如果您的用户模型有一个has_messages()
方法,当用户收到消息时返回True,如果他们没有消息则返回False,您只需将以下逻辑放入auth.html
模板即可:
{% if user.has_messages %}
...
{% else %}
...
{% endif %}
如果您使用的是代理模型而不是自定义用户模型,则需要write a custom context processor将该代理模型放入模板上下文中。看起来应该是这样的:
from models import UserProxy
def add_proxy_user(request):
if request.user.is_authenticated():
return {"proxy_user": UserProxy.objects.get(pk=request.user.pk)}
else:
return {"proxy_user": request.user}
确保将其添加到settings.py中的TEMPLATE_CONTEXT_PROCESSORS。然后,您必须在模板中使用{{proxy_user.has_messages}}。