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

How to run database query every time Django logged-in user requests a page?

我有一个使用 Postgres 9.3 的 Django 1.6 应用程序。站点上每个视图的每个模板都将扩展两个模板中的一个或另一个。一个模板 "anon.html" 将在未登录的用户可以查看的所有页面上显示最小页面 header(例如,在用户还没有帐户的注册过程中)。第二个 "auth.html" 模板扩展到 logged-in 用户查看页面时显示的每个模板中。此模板显示包含 link 的 header,例如 "Show Members"、"Messages"、"Account" 等。呈现此模板的任何视图都将以 @login_required 装饰器开头。当我呈现 "auth.html" 模板时,每次用户请求需要他们登录的页面(换句话说)时,我如何执行 Django 数据库查询?如果用户有新消息,我希望能够将 auth.html 模板 header 中的 "Messages" link 更改为 "New Messages"。此查询必须 运行 在呈现页面的其余部分之前,我不想将查询放在每个视图中。

谢谢!

假设您正在使用 django.core.context_processors.auth context processor,您的模板可以访问 user 对象。

因此,如果您的用户模型有一个 has_messages() 方法,当用户有消息时 returns 为 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 }}。