2009-06-27 9 views
12

Desidero visualizzare un menu che cambia in base al gruppo utente dell'utente attualmente connesso, con questa logica all'interno della mia vista e quindi impostare una variabile per verificare nel modello per determinare quali voci del menu mostrare .... Avevo già fatto questa domanda, ma la mia logica era stata fatta nel modello. Quindi ora voglio che a mio avviso ... Il menu sembra come di seguitoOttieni gruppo utenti in un modello

<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 la gestione degli utenti è, vedranno tutto ... Ma supponendo che l'utente è nelle vendite del gruppo, faranno vedi solo i primi due e gli ultimi due elementi ... e così via. Voglio anche un reindirizzamento dinamico dopo l'accesso basato sul gruppo dell'utente. Qualche idea?

risposta

19

Il modo standard di controllo Django delle autorizzazioni è dato dai singoli flag di autorizzazione piuttosto che dal test per il nome del gruppo.

Se è necessario verificare i nomi dei gruppi, essendo consapevoli del fatto che gli utenti ai gruppi è una relazione molti-a-molti, è possibile ottenere il primo gruppo nella lista dei gruppi nel modello con qualcosa di simile:

{{ user.groups.all.0 }} 

o utilizzarlo come questo in un condizionale (non testato, ma dovrebbe funzionare):

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

Se si va con il modello di autorizzazione preferita si farebbe qualcosa di simile alla seguente.

... 

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

... 

Questi sono i permessi create automaticamente da syncdb supponendo che la vostra applicazione si chiama vehicle e il modello si chiama Vehicle.

Se l'utente è un superutente, dispongono automaticamente di tutte le autorizzazioni.

Se l'utente si trova in un gruppo di vendita, non disporranno di tali autorizzazioni (a meno che non ne abbiate aggiunte al gruppo, ovviamente).

Se l'utente si trova in un gruppo di gestione, può disporre di tali autorizzazioni, ma è necessario aggiungerle al gruppo nel sito di amministrazione Django.

Per l'altra domanda, reindirizzare al login in base al gruppo di utenti: Users to Groups è una relazione molti-a-molti quindi non è davvero una buona idea usarlo come uno-a-molti.

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

Creare un user_tags.py nella vostra app/templatetags seguire sopra:

# -*- 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 

E infine nel modello di usarlo:

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

Basta non dimenticare di '{carico% user_tags%} 'nel modello. – zeridon

+0

come posso usare questo codice per verificare se nel gruppo A o nel gruppo B, ad esempio? – AlexW

Problemi correlati