Dodałem klasę Meta do mojego modelu izsynchronizował DB, a następnie utworzył obiekt w powłoce zwraca false, więc naprawdę nie mogę zrozumieć, gdzie jest błąd lub czego brakuje, jest jakaś konfiguracja może w innych plikach.
class Employer(User):#Employer inherits from User
employer_verified = models.BooleanField(default=False)
class Meta:
permissions = (
("is_member", "Friendly permission description"),
)
emp = Employer.objects.create(blablabla)
emp.save()
emp.has_perm("myappname.is_member")
Odpowiedzi:
18 dla odpowiedzi № 1W podanym przykładzie, oczekiwałbym emp.has_perm("myappname.is_member")
być naprawdę False
. O ile wyraźnie nie podasz nowego Employer
obiekt is_member
pozwolenie, nie będzie go mieć.
Aby programowo nadać mu pozwolenie potrzebne do uzyskania rzeczywistego obiektu uprawnień i dodać go do Employer
"s user_permissions
:
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(Employer)
permission = Permission.objects.get(content_type=content_type, codename="is_member")
emp = Employer.objects.create(blablabla)
emp.save()
emp.user_permissions.add(permission)
Aby przetestować go w powłoce, może być konieczne usunięcie pamięci podręcznej uprawnień, która jest tworzona dla każdego użytkownika - w przeciwnym razie has_perm
może nie odzwierciedlać faktycznych uprawnień:
delattr(emp, "_perm_cache")
Odpowiadając na twoje pytania:
Jeśli chcesz każdy Employer
mieć is_member
pozwolenie jest kilka opcji:
Zastąpić
save
metodaEmployer
sprawdzić, czy nie maself.pk
(co oznacza, że jest to nowy obiekt i utwórz pozwolenie, jak pokazałem powyżej po zapisaniu.) Nie bardzo ładne, ale zadziała.Napisz swoje własne serwer uwierzytelniania. Jeśli kod uprawnień jest
"is_member"
iUser
maEmployer
instancja, returnTrue
Nie używaj uprawnień System uprawnień jest zaprojektowany, aby móc dynamicznie nadawać i odbierać uprawnienia.
User
to jestEmployer
- następnie sprawdź to. Nie komplikuj go, używając uprawnień.