Hoe check je in een sjabloon of de gebruiker tot een groep behoort?
Het is mogelijk in een view
die de template
genereert, maar wat als ik dit wil controleren in base.html
wat een sjabloon uitbreiden (het heeft geen eigen weergavefunctie)?
Al mijn sjablonen breiden base.html
uit, dus het is niet goed om het in elke view
te controleren.
De base.html
bevat een bovenste balk, die knoppen moet bevatten, afhankelijk van in welke group
de aangemelde gebruiker zich bevindt (klanten, verkopers).
In mijn base.html
staat:
{% if user.is_authenticated %}
wat niet genoeg is omdat ik me anders moet gedragen dan gebruikers van Customers
en 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 %}
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.py
aan 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.py
bestand 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 %}