gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:42:38 24 4
gpt4 key购买 nike

我的 base.html 中需要一个特定的上下文变量。这将包含一组用户名,例如[名称 1、名称 2、名称 3、名称 4、]。如果登录用户的用户名是此列表的一部分,我会给予该用户一定的优惠待遇并在导航栏中显示一些内容。

为此,我写了一个模板标签:

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 %}

这是行不通的。我究竟做错了什么?我怀疑我的模板标签写错了,但我尝试了几种更复杂的方法(但没有成功),至少这个更简单的方法对我来说是合乎逻辑的。

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

最佳答案

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

现在您拥有了一个非常有效的属性,您可以在代码中任何地方 检查。我倾向于胖模型、瘦 View 和哑模板。

关于python - 在 base.html (Django) 中使用的上下文变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33325353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com