每次Django登录用户请求页面时如何运行数据库查询?

时间:2015-01-20 22:44:23

标签: django django-templates django-views

我有一个使用Postgres 9.3的Django 1.6应用程序。网站上每个视图的每个模板都将扩展两个模板中的一个或另一个。一个模板" anon.html"将在未登录的用户可以查看的所有页面上显示最小页面标题(例如,在用户尚未拥有帐户的注册过程中)。第二个" auth.html"模板在登录用户查看页面时显示的每个模板中进行扩展。此模板显示一个标题,其中包含"显示成员","消息","帐户"等等。任何呈现此模板的视图都将以@login_required装饰器开头。每当用户请求一个要求他们登录的页面时(换句话说),当我渲染" auth.html"时,我如何执行Django数据库查询?模板?如果用户有新消息,我希望能够更改"消息"在auth.html模板标题中链接以说明"新消息"。此查询必须在呈现页面的其余部分之前运行,并且我不想将查询放在每个视图中。

谢谢!

1 个答案:

答案 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}}。