Ho creato un gruppo personalizzato nel sito di amministrazione di Django.In Django, come posso verificare se un utente si trova in un determinato gruppo?
Nel mio codice, voglio verificare se un utente è in questo gruppo. Come lo faccio?
Ho creato un gruppo personalizzato nel sito di amministrazione di Django.In Django, come posso verificare se un utente si trova in un determinato gruppo?
Nel mio codice, voglio verificare se un utente è in questo gruppo. Come lo faccio?
È possibile accedere ai gruppi semplicemente tramite l'attributo groups
su User
.
from django.contrib.auth.models import User, Group
group = Group(name="Editor")
group.save() # save this new group for this example
user = User.objects.get(pk=1) # assuming, there is one initial user
user.groups.add(group) # user is now in the "Editor" group
poi user.groups.all()
rendimenti [<Group: Editor>]
Se è necessario l'elenco degli utenti che sono in un gruppo, si può fare questo, invece:
from django.contrib.auth.models import Group
users_in_group = Group.objects.get(name="group name").user_set.all()
e quindi controllare
if user in users_in_group:
# do something
per verificare se l'utente è nel gruppo.
Questo non è scalabile per i siti con più di un piccolo numero di utenti, dal momento che caricherà una tabella utenti di sottoinsiemi di grandi dimensioni in memoria ogni volta che viene eseguito. – bhuber
Solo nel caso se il gruppo si vuole dell'utente controllo appartiene a un elenco di gruppo predefinito:
def is_allowed(user):
allowed_group = set(['admin', 'lead', 'manager'])
usr = User.objects.get(username=user)
groups = [ x.name for x in usr.groups.all()]
if allowed_group.intersection(set(groups)):
return True
return False
[FYI puoi dire {x.name per x in usr.groups.all()}] (http://docs.python.org/2/tutorial/datastructures.html#sets) – Kos
tuo utente oggetto è collegato al oggetto Gruppo attraverso un ManyToMany rapporto.
È possibile applicare il metodo filtro a user.groups.
Così, per verificare se un determinato utente è in un certo gruppo ("Stati" per l'esempio), basta fare questo:
def is_member(user):
return user.groups.filter(name='Member').exists()
Se si desidera controllare se un determinato utente appartiene a più di uno determinati gruppi, usa il __in operatore in questo modo:
def is_in_multiple_groups(user):
return user.groups.filter(name__in=['group1', 'group2']).exists()
si noti che queste funzioni possono essere utilizzati con il @user_passes_test decoratore per gestire l'accesso ai vostri punti di vista:
from django.contrib.auth.decorators import login_required, user_passes_test
@login_required
@user_passes_test(is_member) # or @user_passes_test(is_in_multiple_groups)
def myview(request):
# Do your processing
Spero che questo aiuto
Non sono sicuro di il funzionamento interno dell'accesso al DB di django, ma questo sembra molto più efficiente di alcuni altri suggerimenti, come ottenere tutti gli utenti in un gruppo e fare un utente python standard in gruppi (o viceversa). – brianmearns
Grazie per il tuo commento! – Charlesthk
Non devi aggiungere '.exists()' alla fine per restituire un valore booleano? Altrimenti 'is_member()' e 'is_in_multiple_groups()' restituirà un 'QuerySet', che potrebbe non dare il risultato desiderato. –
In una sola riga:
'Groupname' in user.groups.values_list('name', flat=True)
Questo restituisce sia True
o False
.
Questo è inefficiente, dal momento che recupera molti più dati e quindi opera su di esso dal lato di django. È meglio usare '.exists()' per consentire db do the work. – WhyNotHugo
Hai solo bisogno di una sola riga:
from django.contrib.auth.decorators import user_passes_test
@user_passes_test(lambda u: u.groups.filter(name='companyGroup').exists())
def you_view():
return HttpResponse("Since you're logged in, you can see this text!")
Non è un codice molto pulito, e non molto riutilizzabile, ma +1 per metterlo in una riga. – WhyNotHugo
Se non hanno bisogno l'istanza utente in loco (come ho fatto io), è possibile farlo con
User.objects.filter(pk=userId, groups__name='Editor').exists()
Questo produrrà solo una richiesta al database e restituire un valore booleano.
Se un utente appartiene a un certo gruppo o no, può essere verificato nei modelli di Django con:
{% if group in request.user.groups.all %}
"some action"
{% endif %}
questo non funziona per me, sembra che sia necessario confrontare il gruppo con il nome del gruppo – hosein
Il controllo effettivo sarebbe 'se user.groups.filter (name = group_name) .count(): # do something' – Maccesch
o utilizza .exists() invece di .count() –