Ich habe die Meta-Klasse in meinem Modell hinzugefügt und die DB synchronisiert und dann ein Objekt in der Shell erstellt es gibt false zurück, so dass ich wirklich nicht verstehen kann, wo der Fehler ist oder was fehlt, ist eine Art von Konfiguration vielleicht in einigen anderen Dateien ..
%Vor% In dem Beispiel, das Sie angegeben haben, würde ich erwarten, dass emp.has_perm('myappname.is_member')
tatsächlich False
ist. Wenn Sie dem neuen Objekt Employer
nicht explizit die Berechtigung is_member
geben, wird es nicht verwendet.
Geben Sie dem Programm programmatisch die Berechtigung, die Sie benötigen, um das tatsächliche Berechtigungsobjekt abzurufen, und fügen Sie es der Employer
user_permissions
:
Um es in der Shell zu testen, müssen Sie möglicherweise den Berechtigungscache löschen, der für jeden Benutzer erstellt wird. Andernfalls zeigt has_perm
möglicherweise nicht die tatsächlichen Berechtigungen an:
Auf Ihre Fragen antworten:
Wenn Sie möchten, dass jedes einzelne Employer
die Berechtigung is_member
hat, gibt es ein paar Optionen:
Überschreibe die save
-Methode von Employer
, um zu überprüfen, ob self.pk
vorhanden ist (was bedeutet, dass es sich um ein neues Objekt handelt, und erstelle die Berechtigung wie oben gezeigt. Nicht sehr hübsch, aber es würde funktionieren.
Schreiben Sie Ihr eigenes Authentifizierungs-Backend . Wenn der Berechtigungscode 'is_member'
ist und User
eine Employer
-Instanz hat, geben Sie True
Verwenden Sie keine Berechtigungen. Das Berechtigungssystem ist so konzipiert, dass Sie Berechtigungen dynamisch erteilen und entziehen können. Wenn es Ihnen nur interessiert, ob ein User
ein Employer
ist - dann testen Sie es. Verkomplizieren Sie es nicht, indem Sie Berechtigungen verwenden.
Tags und Links python django django-forms django-admin django-models