2009-06-27 6 views
12

Ich möchte ein Menü anzeigen, das sich entsprechend der Benutzergruppe des aktuell angemeldeten Benutzers ändert, wobei sich diese Logik in meiner Ansicht befindet, und anschließend eine Variable zum Einchecken in die Vorlage festlegen Welche Menüpunkte sollen angezeigt werden? Ich habe diese Frage schon einmal gestellt, aber meine Logik wurde in der Vorlage gemacht. So jetzt habe ich es meiner Meinung nach wollen ... Das Menü sieht wie untenBenutzergruppe in einer Vorlage abrufen

<ul class="sidemenu"> 
    <li><a href="/">General List </a></li> 
    <li><a href="/sales_list">Sales List </a></li> 
    <li><a href="/add_vehicle">Add a New Record </a></li> 
    <li><a href="/edit_vehicle">Edit Existing Record </a></li> 
    <li><a href="/filter">Filter Records </a></li> 
    <li><a href="/logout">Logout </a></li> 
    </ul> 

Suppossing die Benutzerverwaltung ist sie alles sehen werde ... Aber vorausgesetzt, der Benutzer ist in der Gruppe Vertrieb, werden sie sehe nur die ersten zwei und die letzten zwei Punkte ... und so weiter. Ich möchte auch eine dynamische Weiterleitung nach dem Login basierend auf der Benutzergruppe. Irgendwelche Ideen?

Antwort

19

Die Django-Standardmethode zum Überprüfen von Berechtigungen besteht eher in den einzelnen Berechtigungsflags als im Testen des Gruppennamens.

Wenn Sie Gruppennamen überprüfen müssen, bewusst zu sein, dass Benutzer den Gruppen eine many-to-many-Beziehung ist, können Sie die erste Gruppe in der Liste der Gruppen in Ihrer Vorlage mit so etwas wie diese bekommen:

{{ user.groups.all.0 }} 

oder es wie folgt in einem bedingten mit (nicht getestet, sollte aber funktionieren):

{% ifequal user.groups.all.0 'Sales' %} 
    ... 
{% endif %} 

Wenn Sie mit dem bevorzugten Berechtigungsmodell gehen würden Sie so etwas wie die folgenden Aktionen aus.

... 

    {% if perms.vehicle.can_add_vehicle %} 
    <li><a href="/add_vehicle">Add a New Record </a></li> 
    {% endif %} 
    {% if perms.vehicle.can_change_vehicle %} 
    <li><a href="/edit_vehicle">Edit Existing Record </a></li> 
    {% endif %} 

... 

Dies sind die Berechtigungen für Sie automatisch von syncdb erstellt Ihre App unter der Annahme vehicle und das Modell Vehicle genannt wird, aufgerufen wird.

Wenn der Benutzer ein Superuser ist, haben sie automatisch alle Berechtigungen.

Wenn der Benutzer in einer Verkaufsgruppe ist, werden diese Fahrzeugberechtigungen nicht verfügbar sein (es sei denn, Sie haben diese zur Gruppe hinzugefügt).

Wenn sich der Benutzer in einer Verwaltungsgruppe befindet, kann er diese Berechtigungen haben, aber Sie müssen sie der Gruppe auf der Django-Verwaltungssite hinzufügen.

Für Ihre andere Frage, Umleitung bei Anmeldung basierend auf Benutzergruppe: Benutzer zu Gruppen ist eine Viele-zu-viele-Beziehung, so ist es nicht wirklich eine gute Idee, es wie eine Eins-zu-viele zu verwenden.

3
user.groups.all.0.name == "groupname" 
9

erstellen user_tags.py in Ihrem app/templatetags folgt oben:

# -*- coding:utf-8 -*- 
from __future__ import unicode_literals 

# Stdlib imports 

# Core Django imports 
from django import template 

# Third-party app imports 

# Realative imports of the 'app-name' package 


register = template.Library() 


@register.filter('has_group') 
def has_group(user, group_name): 
    """ 
    Verifica se este usuário pertence a um grupo 
    """ 
    groups = user.groups.all().values_list('name', flat=True) 
    return True if group_name in groups else False 

Und schließlich in Vorlage verwendet es:

{% if request.user|has_group:"Administradores"%} 
     <div> Admins can see everything </div> 
{% endif %} 
+0

Nur nicht vergessen, zu '{% Last user_tags%} 'in der Vorlage. – zeridon

+0

Wie kann ich mit diesem Code überprüfen, ob zum Beispiel in der Gruppe A oder in der Gruppe B? – AlexW