在base.html(Django)中使用的上下文变量

时间:2015-10-25 01:52:34

标签: python django

我需要在base.html中使用某个上下文变量。这包含一组用户名,例如[name1, name2, name3, name4,]。如果登录用户的用户名是此列表的一部分,我会向用户提供某些优惠待遇并在导航栏中显示某些内容。

为实现这一目标,我写了模板标签

from django import template
from django.db import models
from django.contrib.auth.models import User

register = template.Library()

VIPS = [name1, name2, name3, name4,]

@register.simple_tag
def verified(user):
    return VIPS

register.simple_tag(verified)

然后在base.html中,我在顶部添加了{% load verified %},然后:

{% if user.username in verified %}
<!-- do something -->
{% endif %}

这不起作用。我究竟做错了什么?我怀疑我的模板标签写得不正确,但是我尝试了几种更复杂的方法(徒劳无功),至少这种简单的方法对我来说是合乎逻辑的。

我的项目是 Python 2.7 的遗留 Django 1.5 项目。

1 个答案:

答案 0 :(得分:1)

您不需要register.simple_tag(verified)行,因为@register装饰者已经这样做了。

但是,假设user来自request.user ...

,您可以考虑采用不同的方法来避免模板中的其他处理
@regsiter.assignment_tag(takes_context=True)
def check_user_is_verified(context):
    user = context['request'].user
    return user and user in vips

然后在你的模板中:

{% check_user_is_verified as is_verified %}
{% if is_verified %}
    {# whatever #}
{% endif %}

通过利用赋值标记,您可以检查用户是否经过一次验证,并利用您指定的上下文变量,而不必每次都执行相同的列表处理。

另一种方法是在自定义User对象上使用缓存属性,或者使用&#34; Profile&#34;通过OneToOneField链接到您的用户模型的模型。

from django.utils.functional import cached_property

class Profile(models.Model):
    user = models.OneToOneField(User)

    @cached_property
    def is_verified(self):
        # get the list of vips here
        return self.user in vips

如果您的vips列表发生变化,只需清除缓存密钥,您可以通过信号或Celery任务执行此操作,等等:

del profile_instance.is_verified

现在您拥有一个非常高效的属性,您可以在代码中的任何位置进行检查。我的偏好往往是胖模型,瘦视图和哑模板。