Wie man Berechtigungen in Django zu Modellen hinzufügen und es mit der Shell testen

Ich habe die Meta-Klasse in meinem Modell und synchronisiert die DB dann erstellt ein Objekt in der Shell gibt es false, so dass ich wirklich nicht verstehen kann, wo ist der Fehler oder was fehlt ist es irgendeine Art von Konfiguration vielleicht in einigen anderen Dateien ..

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') 

One Solution collect form web for “Wie man Berechtigungen in Django zu Modellen hinzufügen und es mit der Shell testen”

In dem Beispiel, das du gegeben hast, würde ich erwarten, dass emp.has_perm('myappname.is_member') tatsächlich False . Es sei denn, Sie geben dem neuen Employer Objekt explizit die is_member Berechtigung an, es wird es nicht haben.

Um programmgesteuert die Erlaubnis zu geben, musst du das eigentliche Berechtigungsobjekt erhalten und es den user_permissions des Employer 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) 

Um es in der Shell zu testen, müssen Sie möglicherweise den Berechtigungscache löschen, der für jeden Benutzer erstellt wird – andernfalls kann has_perm die tatsächlichen Berechtigungen nicht widerspiegeln:

 delattr(emp, '_perm_cache') 

Beantworten Sie Ihre Fragen:

Wenn Sie möchten, dass jeder einzelne Employer die is_member Erlaubnis hat, gibt es ein paar Optionen:

  1. Überschreiben Sie die save von Employer , um zu überprüfen, ob es keine self.pk (was bedeutet, dass es ein neues Objekt ist, und erstellen Sie die Berechtigung, wie ich oben nach dem Speichern gezeigt habe. Nicht sehr hübsch, aber es würde funktionieren.

  2. Schreiben Sie Ihr eigenes Authentifizierungs-Backend . Wenn der Berechtigungscode 'is_member' und der User eine Employer Instanz hat, geben Sie True

  3. Verwenden Sie keine Berechtigungen. Das Berechtigungssystem ist für Sie konzipiert, um die Berechtigungen dynamisch zu erteilen und zu widerrufen. Wenn Sie nur darauf achten, ob ein User ein Employer – dann testen Sie dafür. Komplizieren Sie es nicht, indem Sie Berechtigungen verwenden.

  • So erstellen Sie Password Field im Modell django
  • Django-allauth set username das selbe wie email
  • Django admin viele zu viele Teilmenge
  • Ändern Sie das klickbare Feld in Django admin list_display
  • Django: Hinzufügen von Inline-Formate-Zeilen ohne Javascript
  • Verwenden Sie die Django Scheduler App mit Ihren eigenen Modellen
  • Python ist die beste Programmiersprache der Welt.