base.html中的Django变量

时间:2014-01-11 13:03:44

标签: python django

base.html用作所有其他页面的基本模板。 base.html有导航栏,在导航栏中,我想显示用户收到的邮件数量。因此,我需要{{number_of_messages}}中的变量base.html

但是,我应该如何将此变量传递给它?每个模板都扩展base.html并由函数呈现。我不认为在所有函数中返回number_of_messages是一个好方法。有没有更好的方法来实现这个?如何将此变量传递给所有模板?

4 个答案:

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

这附带了它自己的上下文处理器(只要您使用renderRequestContext)就可以在模板中创建{{ 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 }}