Django jinja if-elif 语句以 == 中断
Django jinja if-elif statement breaks with ==
所以在我的前端,我只想在用户属于以下两个组之一时显示一些 HTML:'admins' 或 'clerks'。有 3 组用户:'admins'、'clerks' 和 'sellers'。这是我的前端代码:
{% if user.groups.all.0 == "admins" %}
<h1>Some HTML</h1>
{% elif user.groups.all.0 == "clerks" %}
<h1>Some HTML</h1>
{% endif %}
当我 运行 此代码时, HTML 显示给管理员。但是店员的那个没有显示。我已经尝试打印出该组以确保拼写和大小写相同,并且它们是相同的。而且 Django 不会抛出错误。仅当我按如下方式重写代码时它才有效:
{% if user.groups.all.0 == "admins" %}
<h1>Some HTML</h1>
{% elif user.groups.all.0 != "sellers" %}
<h1>Some HTML</h1>
{% endif %}
但我觉得这不是一个好的设计。请问我错过了什么吗?提前谢谢大家
首先,由于太多原因,这是一个不切实际的想法。
认为使用该方法您会获得与模板不对应的可能性和处理。模板引擎的理念只是基本的,没有重要的逻辑。
一种获得更多控制和更实用的方法是使用标志。例如
groups_permited_for_this=["admins","clerks",...]
Permited =False
for group in user.Groups.all:
if group.name in groups_permited_for_this:
Permited =True
将其作为上下文传递,然后使用 Jinja if 语句。
所以我用与上面的略有不同的方式解决了这个问题:
首先,我在应用程序中创建了一个名为 'templatetags' 的文件夹。
然后我在里面创建了2个文件:
- 一个空的“init.py”文件
- 一个'cust_auth.py'(用于自定义身份验证)文件
在 'cust_auth.py' 文件中,我编写了一个函数,其功能与上述 #Paulo Aguilar 的回答类似:
from django import template
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
group = Group.objects.get(name=group_name)
return True if group in user.groups.all() else False
然后在我的模板中,我在顶部加载了 'cust_auth.py' 文件:
{% load auth_extras %}
然后我做了我正在寻找的逻辑:
{% if user|has_group:"admins" %}
<h1>Some HTML</h1>
{% endif %}
我更喜欢这个,因为我考虑了我的应用程序的原因,我会想要更多的自定义身份验证
谢谢 Paulo 和发帖的人
所以在我的前端,我只想在用户属于以下两个组之一时显示一些 HTML:'admins' 或 'clerks'。有 3 组用户:'admins'、'clerks' 和 'sellers'。这是我的前端代码:
{% if user.groups.all.0 == "admins" %}
<h1>Some HTML</h1>
{% elif user.groups.all.0 == "clerks" %}
<h1>Some HTML</h1>
{% endif %}
当我 运行 此代码时, HTML 显示给管理员。但是店员的那个没有显示。我已经尝试打印出该组以确保拼写和大小写相同,并且它们是相同的。而且 Django 不会抛出错误。仅当我按如下方式重写代码时它才有效:
{% if user.groups.all.0 == "admins" %}
<h1>Some HTML</h1>
{% elif user.groups.all.0 != "sellers" %}
<h1>Some HTML</h1>
{% endif %}
但我觉得这不是一个好的设计。请问我错过了什么吗?提前谢谢大家
首先,由于太多原因,这是一个不切实际的想法。 认为使用该方法您会获得与模板不对应的可能性和处理。模板引擎的理念只是基本的,没有重要的逻辑。 一种获得更多控制和更实用的方法是使用标志。例如
groups_permited_for_this=["admins","clerks",...]
Permited =False
for group in user.Groups.all:
if group.name in groups_permited_for_this:
Permited =True
将其作为上下文传递,然后使用 Jinja if 语句。
所以我用与上面的略有不同的方式解决了这个问题: 首先,我在应用程序中创建了一个名为 'templatetags' 的文件夹。 然后我在里面创建了2个文件:
- 一个空的“init.py”文件
- 一个'cust_auth.py'(用于自定义身份验证)文件 在 'cust_auth.py' 文件中,我编写了一个函数,其功能与上述 #Paulo Aguilar 的回答类似:
from django import template
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
group = Group.objects.get(name=group_name)
return True if group in user.groups.all() else False
然后在我的模板中,我在顶部加载了 'cust_auth.py' 文件:
{% load auth_extras %}
然后我做了我正在寻找的逻辑:
{% if user|has_group:"admins" %}
<h1>Some HTML</h1>
{% endif %}
我更喜欢这个,因为我考虑了我的应用程序的原因,我会想要更多的自定义身份验证 谢谢 Paulo 和发帖的人