Hoe te controleren (in sjabloon) of gebruiker tot een groep behoort

Hoe check je in een sjabloon of de gebruiker tot een groep behoort?

Het is mogelijk in een viewdie de templategenereert, maar wat als ik dit wil controleren in base.htmlwat een sjabloon uitbreiden (het heeft geen eigen weergavefunctie)?

Al mijn sjablonen breiden base.htmluit, dus het is niet goed om het in elke viewte controleren.

De base.htmlbevat een bovenste balk, die knoppen moet bevatten, afhankelijk van in welke groupde aangemelde gebruiker zich bevindt (klanten, verkopers).

In mijn base.htmlstaat:

{% if user.is_authenticated %}

wat niet genoeg is omdat ik me anders moet gedragen dan gebruikers van Customersen gebruikers van Sellers.

Dus wat ik wil is:

{% if user.in_group('Customers') %}
 <p>Customer</p>
{% endif %}
{% if user.in_group('Sellers') %}
<p>Seller</p>
{% endif %}

Antwoord 1, autoriteit 100%

U heeft een aangepaste sjabloontag nodig:

from django import template
register = template.Library() 
@register.filter(name='has_group') 
def has_group(user, group_name):
    return user.groups.filter(name=group_name).exists() 

In uw sjabloon:

{% if request.user|has_group:"mygroup" %} 
    <p>User belongs to my group 
{% else %}
    <p>User doesn't belong to mygroup</p>
{% endif %}

Bron: http ://www.abidibo.net/blog/2014/05/22/check-if-user-belongs-group-django-templates/

Documenten: https://docs.djangoproject.com/en /dev/howto/custom-template-tags/


Antwoord 2, autoriteit 27%

Maak in je app een map ‘templatetags’ aan. Maak in deze map twee bestanden aan:

__init__.py

auth_extras.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

Het zou er nu zo uit moeten zien:

app/
    __init__.py
    models.py
    templatetags/
        __init__.py
        auth_extras.py
    views.py

Na het toevoegen van de templatetags-module, moet u uw server opnieuw opstarten voordat u de tags of filters in sjablonen kunt gebruiken.

Gebruik in uw base.html(sjabloon) het volgende:

{% load auth_extras %}

en om te controleren of de gebruiker in de groep “moderator” zit:

{% if request.user|has_group:"moderator" %} 
    <p>moderator</p> 
{% endif %}

Documentatie: https://docs.djangoproject.com/en /1.11/howto/custom-template-tags/


Antwoord 3, autoriteit 16%

Ik zou zeggen dat de beste manier is:

yourapp/templatetags/templatetagname.py

from django import template
register = template.Library() 
@register.filter(name='has_group') 
def has_group(user, group_name):
    return user.groups.filter(name=group_name).exists() 

yourapp/templates/yourapp/yourtemplate.html:

{% load has_group %}
{% if request.user|has_group:"mygroup" %} 
    <p>User belongs to my group</p>
{% else %}
    <p>User does not belong to my group</p>
{% endif %}

EDIT: regel toegevoegd met laden van sjabloontag zoals geadviseerd in opmerkingen.

EDIT2: kleine typfout verholpen.


Antwoord 4, autoriteit 13%

Pas op dat je een uitzondering krijgt als de groep niet bestaat in de DB.

De aangepaste sjabloontag moet zijn:

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):
    try:
        group =  Group.objects.get(name=group_name)
    except Group.DoesNotExist:
        return False
    return group in user.groups.all()

Uw sjabloon:

{% if request.user|has_group:"mygroup" %} 
    <p>User belongs to my group 
{% else %}
    <p>User doesn't belong to mygroup</p>
{% endif %}

Antwoord 5, autoriteit 10%

In uw sjabloon

{% ifequal user.groups.all.0.name "user" %}
  This is User
{% endifequal %}
  

Snippet uitvouwen


Antwoord 6, autoriteit 4%

U kunt dit gebruiken:

{% for group_for in request.user.groups.all %}
    {% if group_for.name == 'Customers' %}
        Text showed to users in group 'Customers'
    {% elif group_for.name == 'Sellers' %}
        Text showed to users in group 'Sellers'
    {% endif %}
{% endfor %}

Dit is het doorlopen van groepen die gerelateerd zijn aan de gebruiker die het verzoek doet en de tekst afdrukken als de naam van de herhaalde groep gelijk is aan ‘Klanten’, ‘Verkopers’, enz.


Antwoord 7, autoriteit 2%

{% if target_group in user.groups.all.0.name %}
    # do your stuff
{% endif %}

Antwoord 8, autoriteit 2%

Hoewel het antwoord van mishbah goed is, werkte het niet voor mij.

Ik gebruik Django 2.2.7 en ik ben erachter gekomen dat register = template.Library()moet worden vervangen door from django.template.defaultfilters import register.

ik hoop dat iemand het nuttig zal vinden.


Antwoord 9, autoriteit 2%

De gemakkelijkste manier die ik heb gevonden, is door alle groepsnamen aan de context toe te voegen met behulp van een context_preprocessor

Maak in uw app een bestand context_processors.pyaan en voeg de volgende inhoud toe:

def user_groups_processor(request):
    groups = []
    user = request.user
    if user.is_authenticated:
        groups = list(user.groups.values_list('name',flat = True))
    return {'groups': groups}

voeg in je instellingen de nieuwe contextprocessor toe

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
             "context_processors": [
                "my_app.context_processors.user_groups_processor"
            ],
        },
    },
]

Of als je wilt in settings.py

TEMPLATES[0]['OPTIONS']['context_processors'].append("my_app.context_processors.user_groups_processor")

Daarna kunt u in uw sjablonen het volgende gebruiken:

{% if 'vip' in groups %}
  <p>Paragraph only visible to VIPs</p>
{% endif %}

Antwoord 10

In mijn geval was het probleem dat ik {% load filter_method_name %}

gebruikte

Ik moest veranderen naar {% load filename %}

Bijvoorbeeld

app/
    __init__.py
    models.py
    templatetags/
        __init__.py
        auth_extras.py
    views.py

Hier is de template taq {% load auth_extras %}

Vervolgens moest ik de server opnieuw opstarten.


Antwoord 11

Eerst moet u een aangepaste filterfunctie definiëren binnen has_group.py

from django import template
from xx.models import Xuser
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
    try:
        group = Xuser.objects.get(email=user.email)
        if group.role == group_name:
            return True
        else:
            return False
    except Xuser.DoesNotExist:
        return False
    return group

in django settings.pybestand dat je moet toevoegen

'libraries': {
                'my_templatetag': 'xx.templates.has_group',
            },

binnen TEMPLATES = []

en voeg dan toe

{% load my_templatetag %}

in uw voorbeeld.html

in de laatste

{% if user|has_group:"admin" %} 
 {% endif %}

Other episodes