python - tutorial - ¿Cómo agregar permisos personalizados al modelo de usuario en django?
permisos en django (3)
No creo que haya una respuesta "correcta" aquí, pero utilicé exactamente el mismo código que tú, excepto que cambié Permission.objects.create
por Permission.objects.get_or_create
y funcionó find para sincronizar con syncdb
en django de forma predeterminada cuando syncdb se ejecuta con django.contrib.auth instalado, crea permisos predeterminados en cada modelo ... como foo.can_change, foo.can_delete y foo.can_add. Para agregar permisos personalizados a los modelos, se puede agregar Meta de clase: debajo del modelo y definir los permisos allí, como se explica aquí https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions
Mi pregunta es: ¿qué debo hacer si deseo agregar un permiso personalizado al modelo de usuario? como foo.can_view. Podría hacer esto con el siguiente fragmento,
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()
Pero quiero algo que funcione bien con syncdb, por ejemplo, la clase Meta en mis modelos personalizados. Debería tener estos en la clase Meta: bajo UserProfile ya que esa es la manera de extender el modelo de usuario. ¿Pero es esa la manera CORRECTA de hacerlo? ¿No lo vincularía al modelo de perfil de usuario?
Podrías hacer algo como esto:
en el __init__.py
de tu aplicación Django agrega:
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)
Una respuesta actualizada para Django 1.8. La señal pre_migrate
se usa en lugar de pre_syncdb
, ya que syncdb está en desuso y la documentación recomienda usar pre_migrate
lugar de post_migrate
si la señal alterará la base de datos. Además, @receiver
se utiliza para conectar add_user_permissions
a la señal.
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)