/ / Wie füge ich dem Benutzermodell in Django eine benutzerdefinierte Berechtigung hinzu? - Python, Django, Django-Berechtigungen

Wie füge ich dem Benutzermodell in Django eine benutzerdefinierte Berechtigung hinzu? - Python, Django, Django-Berechtigungen

in django standardmäßig, wenn syncdb mit ausgeführt wirddjango.contrib.auth installiert, erstellt es Standardberechtigungen für jedes Modell ... wie foo.can_change, foo.can_delete und foo.can_add. Um Modellen benutzerdefinierte Berechtigungen hinzuzufügen, können Sie die Klasse Meta: unter dem Modell hinzufügen und dort Berechtigungen definieren, wie hier erläutert https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions

Meine Frage ist, was soll ich tun, wenn ich dem Benutzermodell eine benutzerdefinierte Berechtigung hinzufügen möchte? wie foo.can_view. Ich könnte dies mit dem folgenden Schnipsel tun,

ct = ContentType.objects.get(app_label="auth", model="user")
perm = Permission.objects.create(codename="can_view", name="Can View Users",
content_type=ct)
perm.save()

Aber ich möchte etwas, mit dem ich gut spielen kannsyncdb, zum Beispiel die Klasse Meta unter meinen benutzerdefinierten Modellen. Sollte ich diese nur in der Klasse Meta haben: unter UserProfile, da dies der Weg ist, das Benutzermodell zu erweitern. Aber ist das der RICHTIGE Weg? Wäre das nicht ein Bindeglied zum UserProfile-Modell?

Antworten:

8 für die Antwort № 1

Du könntest so etwas tun:

in dem __init__.py deiner Django App füge hinzu:

from django.db.models.signals import post_syncdb
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth import models as auth_models
from django.contrib.auth.models import Permission

# custom user related permissions
def add_user_permissions(sender, **kwargs):
ct = ContentType.objects.get(app_label="auth", model="user")
perm, created = Permission.objects.get_or_create(codename="can_view", name="Can View Users", content_type=ct)
post_syncdb.connect(add_user_permissions, sender=auth_models)

3 für die Antwort № 2

Ich glaube nicht, dass es hier eine "richtige" Antwort gibt, aber ich habe genau denselben Code wie Sie verwendet, außer dass ich ihn geändert habe Permission.objects.create zu Permission.objects.get_or_create und das hat funktioniert find mit syncdb synchronisieren


2 für die Antwort № 3

Eine aktualisierte Antwort für Django 1.8. Das Signal pre_migrate wird anstelle von verwendet pre_syncdb, da syncdb veraltet ist und in den Dokumenten empfohlen wird pre_migrate Anstatt von post_migrate ob das Signal die Datenbank verändern wird. Ebenfalls, @receiver wird zum Verbinden verwendet add_user_permissions zum Signal.

from django.db.models.signals import pre_migrate
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth import models as auth_models
from django.contrib.auth.models import Permission
from django.conf import settings
from django.dispatch import receiver


# custom user related permissions
@receiver(pre_migrate, sender=auth_models)
def add_user_permissions(sender, **kwargs):
content_type = ContentType.objects.get_for_model(settings.AUTH_USER_MODEL)
Permission.objects.get_or_create(codename="view_user", name="View user", content_type=content_type)