2011-10-11 8 views
16

in django per impostazione predefinita quando syncdb viene eseguito con django.contrib.auth installato, crea le autorizzazioni predefinite per ogni modello ... come foo.can_change, foo.can_delete e foo.can_add. Per aggiungere permessi personalizzati ai modelli si può aggiungere la classe Meta: sotto il modello e definire le autorizzazioni lì, come spiegato qui https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissionsCome aggiungere permessi personalizzati al modello User in django?

La mia domanda è che cosa devo fare se voglio aggiungere un'autorizzazione personalizzata al modello Utente? come foo.can_view. Potrei farlo con il seguente frammento,

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() 

Ma voglio qualcosa che gioca bene con syncdb, ad esempio, la Meta di classe sotto i miei modelli personalizzati. Dovrei avere questi in classe Meta: sotto UserProfile dato che è il modo di estendere il modello utente. ma è il modo giusto per farlo? Non lo legherebbe al modello UserProfile?

+0

Si può fare nella migrazione modello: http://stackoverflow.com/a/32706020/538284 –

risposta

3

Io non credo che ci sia un "diritto" risposta qui, ma ho usato lo stesso codice esattamente come voi, se non ho cambiato Permission.objects.create-Permission.objects.get_or_create e che ha funzionato trovare per la sincronizzazione con syncdb

+0

non si get_or_create, creare un altro il permesso se il nome cambia ma rimane lo stesso nome in codice? –

+1

dovresti usare il codename solo come get get di get o create, e mettere il nome in "default" – leech

8

Si potrebbe fare qualcosa di simile questo:

nel __init__.py del vostro Django App Aggiungi:

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

Inserire un '__init __. Py' e collegarti a' post_syncdb' è probabilmente una buona idea, ma il codice sopra non lo ha lavora per me Devo usare 'ContentType.objects.get_for_model (model = auth_models.User)'. Altrimenti, ha funzionato. – brianmearns

2

Una risposta aggiornato per Django 1.8. Il segnale pre_migrate viene utilizzato al posto di pre_syncdb, poiché syncdb è deprecato e i documenti consigliano di utilizzare pre_migrate anziché post_migrate se il segnale modificherà il database. Inoltre, @receiver viene utilizzato per collegare add_user_permissions al segnale.

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

Posso chiedere in quale file devo inserire questo codice? Ho pensato che fosse impostato nei modelli come nella versione precedente di Django ma non sono sicuro ... – softwareplay

+0

@mcastle Lo metto in '__init __. Py' ma la query di corrispondenza" DoesNotExist: ContentType non esiste ". l'errore sta ancora arrivando –