2016-01-02 14 views
13

Wie einchecken, ob der Benutzer zu einer Gruppe gehört?So prüfen Sie (in der Vorlage), ob der Benutzer zu einer Gruppe gehört

Es ist möglich, in einem view die die template erzeugt aber was, wenn ich will das in base.html überprüfen, welche eine Verlängerung Vorlage ist (es muss nicht eine eigene View-Funktion ist)?

Alle meine Vorlagen erweitert base.html, so ist es nicht gut, es in jedem view zu überprüfen.

Die base.html enthält obere Leiste, die je nachdem, in welchem ​​group angemeldeten Benutzer (Kunden, Verkäufer) Tasten enthalten sollte.

In meinem base.html ist:

{% if user.is_authenticated %} 

das nicht genug ist, weil ich anders an Benutzer von Customers und Anwender aus Sellers handeln.

Also das, was ich will, ist:

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

Antwort

26

Sie benötigen individuelle Template-Tag:

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 group in user.groups.all() 

in Ihrer Vorlage:

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

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

Docs : https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/

+0

Mischmasch, danke. Ich habe diese Webseite gelesen, aber ich weiß nicht, wo dieser Code sein sollte. –

+0

Siehe https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/ – mishbah

+1

Wie würden Sie den Fall behandeln, in dem 'Group.objects.get (name = Gruppenname)' kein Objekt zurückgibt ? – danielmaxx

6

In Ihrer App erstellen Sie einen Ordner 'Templatetags'. In diesem Ordner erstellen Sie zwei Dateien:

__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 

Es sieht jetzt aussehen sollte:

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

Nach Hinzufügen der Vorlage gs-Modul müssen Sie Ihren Server neu starten, bevor Sie die Tags oder Filter in Templates verwenden können.

In Ihrer Basis.html (Template) verwenden Sie die folgende:

{% load auth_extras %} 

und zu überprüfen, ob der Benutzer in der Gruppe "Moderator" ist:

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

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

1

in Ihrer Vorlage

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

+0

Dies funktioniert wunderbar, wenn der Benutzer zu einer einzigen Gruppe gehört. Wenn ein Benutzer mehreren Gruppen angehört, gibt es eine einfache Möglichkeit, dies zu ändern, sodass wir nicht nur auf all.0.name prüfen. – LNI

4

Achten Sie darauf, dass Sie eine Ausnahme erhalten, wenn die Gruppe in der DB nicht existiert.

sollte das individuelle Template-Tag sein:

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() 

Ihre Vorlage:

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

Dies ist eine bessere Antwort, da es einen try/catch-Block verwendet und in Ihrer Vorlage kein Fehler auftritt, wenn der Benutzer nicht zur Gruppe gehört. –

1

Ich würde sagen, dass der beste Weg ist:

yourapp/templatetags/templatetagname.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): 
    return user.groups.filter(name=group_name).exists() 

yourapp/templates/yourapp/yurtemplate.html: