/ / ¿Cómo agregar permisos personalizados al modelo de usuario en django? - python, django, django-permisos

¿Cómo agregar permisos personalizados al modelo de usuario en django? - python, django, django-permisos

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 № 1

Podrí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)