Dodanie użytkownika do grupy w django

143

Jak dodać użytkownika do grupy w django na podstawie nazwy grupy?

Mogę to zrobić:

user.groups.add(1) # add by id

Jak bym zrobił coś takiego:

user.groups.add(name='groupname') # add by name
David542
źródło
Czy ta wersja rozwiązania jest wrażliwa? Kiedy próbowałem to jest django 1.8, otrzymałem "nieoczekiwane słowo kluczowe: nazwa"
rschwieb

Odpowiedzi:

266

Znajdź grupę za pomocą modelu grupy z nazwą grupy, a następnie dodaj użytkownika do user_set

from django.contrib.auth.models import Group
my_group = Group.objects.get(name='my_group_name') 
my_group.user_set.add(your_user)
juankysmith
źródło
18
Dzięki za to. Wydaje się głupie, że w dokumentach django brakuje niektórych najbardziej podstawowych rzeczy lub są one trudne do znalezienia
Francis Yaconiello
1
docs.djangoproject.com/en/dev/intro/tutorial01 Podobne przykłady znajdują się w sekcji „Zabawa z API”
juankysmith
9
Samouczek jest całkiem przydatny. Chodziło mi o to, że spodziewałbym się zobaczyć w sekcji dokumentacji w ramach auth do programowego tworzenia grup. zamiast tego istnieje tylko słaby akapit: docs.djangoproject.com/en/1.3/topics/auth/#groups Myślę, że warto pamiętać, że modele auth to tylko zwykłe modele i mają zastosowanie standardowe odniesienia do modeli.
Francis Yaconiello
gdzie jest user_setw Django doc? Nie mogę go nigdzie znaleźć
Minh Thai
1
@MinhThai domyślną wartością pola relacji odwrotnej jest <content_type>_setsytuacja, related_namew której pole nie jest ustawione.
sox z Monicą
103

Oto jak to zrobić w nowoczesnych wersjach Django (przetestowanych w Django 1.7):

from django.contrib.auth.models import Group
group = Group.objects.get(name='groupname')
user.groups.add(group)
coredumperror
źródło
1
możesz też to zrobić Group.objects.get_by_natural_key('groupname'), ale to nie powoduje zwarcia: D
CpILL
2
@enchance Gdziekolwiek potrzebujesz. Prawdopodobnie w kodzie widoku, który wykonuje przypisania grupowe.
coredumperror
0

coredumperror ma rację, ale znalazłem jedną rzecz, którą muszę się nią podzielić

from django.contrib.auth.models import Group

# get_or_create return error due to 
new_group = Group.objects.get_or_create(name = 'groupName')
print(type(new_group))       # return tuple

new_group = Group.objects.get_or_create(name = 'groupName')
user.groups.add(new_group)   # new_group as tuple and it return error

# get() didn't return error due to 
new_group = Group.objects.get(name = 'groupName')
print(type(new_group))       # return <class 'django.contrib.auth.models.Group'>

user = User.objects.get(username = 'username')
user.groups.add(new_group)   # new_group as object and user is added
VigneshKarthik Kasiviswanathan
źródło