当前位置: 代码迷 >> python >> 要在 base.html (Django) 中使用的上下文变量
  详细解决方案

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

热度:121   发布时间:2023-06-13 17:25:24.0

我的 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项目。

您不需要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 %}

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

另一种选择是在自定义用户对象上使用缓存属性,或通过 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

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

  相关解决方案