如何跨所有模板访问模型属性?

时间:2018-07-20 22:57:45

标签: python html django

我有一个模型团队,其属性名称为:

class Team(models.Model):
     name = models.CharField(max_length=50, null=True, blank=True)

我想将团队名称放在网站的标题中,就像我的模板语言那样:

{% if team.name %}
<h1>{{ team.name }}</h1>
{% endif %}

但是,仅当我在对团队模型进行查询的视图上时才显示名称。所以我想我需要在所有视图/模板中都可以使用该查询。最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

您要为每个 模板调用设置的变量(当然,您不必使用本身,但是通常在几乎所有的变量中使用它们时,它都会有所作为模板),可以使用上下文处理器设置。

上下文处理器是将request参数作为输入并返回将变量名(即字符串)映射到该参数应携带的内容的字典的函数,例如:

# myapp/context_processors.py

def first_team(request):
    return { 'first_team': Team.objects.first() }

我们可以将它们存储在一个应用程序下(无关紧要的是哪个,但通常是语义上最接近上下文处理器正在执行的操作的一个)。

接下来,我们可以在settings.py中注册上下文处理器。我们可以更改TEMPLATES设置,并注册上下文处理器:

# settings.py

TEMPLATES = [
    {

        # ...

        'OPTIONS': {
            'context_processors': [
                # ...
                'myapp.context_processors.first_team',
                # ...
            ],
        },

        # ...

    },
]

实际上,您很可能已经有一些上下文处理器而没有注意到。

接下来,您可以在渲染的每个模板中使用{{ first_team }}(及其衍生产品)(渲染时不覆盖设置)。请注意,在上下文处理器中为变量命名时必须小心,因为它们可以覆盖现有变量。