Django оператор jinja if-elif прерывается с помощью == - PullRequest
0 голосов
/ 12 июля 2020

Итак, в моем интерфейсе я хочу показать некоторые HTML, только если пользователь принадлежит к одной из двух групп: «администраторы» или «клерки». Есть 3 группы пользователей: «администраторы», «клерки» и «продавцы». Вот мой внешний код:

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

Но мне кажется, что это плохой дизайн. Пожалуйста, я что-то упускаю? Заранее всем спасибо

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Итак, я решил проблему немного иначе, чем описанный выше: во-первых, я создал внутри приложения папку с названием «templatetags». Затем я создал в нем 2 файла:

  1. Пустой файл ' init .py'
  2. Файл 'cust_auth.py' (для пользовательской аутентификации) Внутри файл 'cust_auth.py' Я написал функцию, которая делает то же самое, что и в ответе Пауло Агилара выше:
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 %}

Затем я сделал logi c Я искал:

{% if user|has_group:"admins" %}
<h1>Some HTML</h1>
{% endif %}

Я предпочел это, потому что я обдумываю причину моего приложения, я хотите больше пользовательских аутентификаций Спасибо, Пауло и всем, кто публикует

0 голосов
/ 13 июля 2020

Прежде всего, это непрактичная идея по слишком многим причинам. Подумайте, что, используя этот метод, вы получаете возможности и обработку, которые не соответствуют шаблонам. Философия движка шаблонов - это просто базовая c и никакой важной логики c. Более практичный способ получить больший контроль - использовать флаг. Например,

groups_permited_for_this=["admins","clerks",...]

Permited =False
for group in user.Groups.all:
   if group.name in groups_permited_for_this:
        Permited =True

Передайте его как контекст, а затем используйте оператор if Jinja.

...