2011-10-11 31 views
16

en django de forma predeterminada cuando se ejecuta syncdb con django.contrib.auth, crea permisos predeterminados en cada modelo ... como foo.can_change, foo.can_delete y foo.can_add. Para agregar permisos personalizados a los modelos, puede agregar clase Meta: bajo el modelo y definir permisos allí, como se explica aquí https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions¿Cómo agregar permisos personalizados al modelo de usuario en django?

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 yo quiero algo que juega muy bien con syncdb, por ejemplo, el Meta clase bajo mis modelos personalizados. ¿Debería tener estos en clase Meta: en UserProfile ya que esa es la forma de extender el modelo de usuario? pero es esa la forma correcta de hacerlo? ¿No lo ataría eso al modelo UserProfile?

+0

Usted puede hacer que en la migración modelo: http://stackoverflow.com/a/32706020/538284 –

Respuesta

3

No creo que hay una respuesta "correcta" aquí, pero he utilizado el mismo código a medida que he cambiado, excepto a Permission.objects.createPermission.objects.get_or_create y que trabajaba encontrar sincronizar con syncdb

+0

no se get_or_create, crear otro permiso si los cambios de nombre, pero nombre en clave sigue siendo el mismo? –

+1

debe usar el nombre clave solo como obtener la parte de obtener o crear, y poner el nombre en "valores predeterminados" – leech

8

Se podría hacer algo como esto:

en el __init__.py de su aplicación Agregar Django:

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) 
+0

Poner un '__init __. Py' y conectarse a' post_syncdb' es probablemente una buena idea, pero el código anterior no lo hizo no funciona para mí Tengo que usar 'ContentType.objects.get_for_model (model = auth_models.User)'. De lo contrario, funcionó. – brianmearns

2

Una respuesta actualizada para Django 1.8. Se utiliza la señal pre_migrate en lugar de pre_syncdb, ya que syncdb está en desuso y los documentos recomiendan usar pre_migrate en lugar de post_migrate si la señal modificará la base de datos. Además, @receiver se usa 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) 
+3

¿Puedo preguntar en qué archivo tengo que poner este código? Pensé que se establecería en modelos como en la versión anterior de Django, pero no estoy seguro ... – softwareplay

+0

@mcastle Puse esto en '__init __. Py' pero la" consulta de correspondencia DoesNotExist: ContentType no existe. " el error sigue viniendo –

Cuestiones relacionadas