usuarios tutorial sesiones sesion registro permisos inicio facilito datos crear con codigo python django django-permissions

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)