2016-08-15 4 views
2

J'essaie d'ajouter une permission 'view_user' au modèle User dans Django. J'ai ajouté un modèle proxy:Ajout de l'autorisation au modèle User dans Django

from django.contrib.auth.models import User, Permission 
from django.db import models 


class RodanUser(User): 
    class Meta: 
     proxy = True 
     permissions = (
      ('view_user', 'View User'), 
     ) 

mais je reçois l'erreur:

ContentType matching query does not exist. 

qui à mon avis est que le app_label de l'utilisateur de Django est auth mais app_label de RodanUser est rodan donc j'ai changé le modèle et ajouté app_label:

from django.contrib.auth.models import User, Permission 


class RodanUser(User): 
    class Meta: 
     proxy = True 
     permissions = (
      ('view_rodanuser', 'View User'), 
     ) 
     app_label = 'auth' 

maintenant je l'erreur:

MixedContentTypeError at /users/ 

Strangest chose est que je réellement été en mesure d'obtenir que cela fonctionne en ajoutant d'abord un modèle none-proxy:

from django.contrib.auth.models import User, Permission 
from django.db import models 


class RodanUser(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 

    class Meta: 
     permissions = (
      ('view_rodanuser', 'View Rodan User'), 
     ) 

puis changer dans le modèle de procuration ci-dessus (sans app_label) car le modèle sans proxy ajoutera l'autorisation dans la base de données où l'élément content_type_id pointe vers RodanUser au lieu de User.

J'ai trouvé this ce qui explique pourquoi je ne peux pas utiliser un proxy avec permission. D'autres suggestions?

Répondre

1

Je résolu ce problème en utilisant une autre approche: dans __init__.py de mon projet, j'ajouté:

@receiver(post_migrate) 
def add_user_view_permissions(sender, **kwargs): 
    content_type = ContentType.objects.get(app_label='auth', model='user') 
    Permission.objects.get_or_create(codename='view_user', name='View User', content_type=content_type) 

Ce qui ajoute l'autorisation après la migration.

+0

est-ce le '__init __. Py' de l'application django (celle qui a le même nom que le projet django) ou le projet django lui-même? –