en django por defecto cuando se ejecuta syncdb condjango.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 juegue muy bien consyncdb, 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 UserProfile?
Respuestas
8 para la respuesta № 1Podrías hacer algo como esto:
en el __init__.py
de su aplicación Django agregue:
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 para la respuesta № 2
No creo que haya una respuesta "correcta" aquí, pero utilicé exactamente el mismo código que usted, excepto que cambié Permission.objects.create
a Permission.objects.get_or_create
y que funcionó encontrar para sincronizar con syncdb
2 para la respuesta № 3
Una respuesta actualizada para Django 1.8. La señal pre_migrate
se utiliza en lugar de pre_syncdb
, ya que syncdb está en desuso y la documentación recomienda usar pre_migrate
en lugar de post_migrate
Si la señal va a alterar la base de datos. También, @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)