2015-08-11 2 views
5

Voici mon code dans le fichier signals.py placé dans le paquet où le modèle d'authentification est défini.dans django 1.8, comment définir l'expéditeur pour le récepteur de signal post_migrate et post_syncdb lorsqu'un modèle utilisateur personnalisé est défini?

@receiver(post_migrate, sender=settings.AUTH_USER_MODEL) 
def define_groups(sender, **kwargs): 
    # Create groups 
    Group.objects.get_or_create(name='Promoter') 
    Group.objects.get_or_create(name='Client') 
    Group.objects.get_or_create(name='Superuser') 
    Group.objects.get_or_create(name='Staff') 

La documentation (https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#referencing-the-user-model) indique qu'il devrait être défini comme

sender=settings.AUTH_USER_MODEL 

alors que cela ne fonctionne que pour post_save comme mentionné dans l'exemple de la documentation.

Je l'ai déjà essayé get_user_model() et aussi directement en utilisant les my_custom_user.models.

get_user_model() renvoie une erreur, tout en établissant des modèles comme émetteur fonctionne très bien, comme -

from . import models 

@receiver(post_syncdb, sender=models) 
def define_groups(sender, **kwargs): 
    # Create groups 
    Group.objects.get_or_create(name='Promoter') 
    Group.objects.get_or_create(name='Client') 
    Group.objects.get_or_create(name='Superuser') 
    Group.objects.get_or_create(name='Staff') 

Mais d'après la documentation ce n'est pas la bonne façon de consulter un modèle d'utilisateur personnalisé et est juste une solution de contournement laide.

Est-ce que quelqu'un pourrait m'aider avec une solution pour que je puisse ajouter ces groupes avec la première migration du modèle d'utilisateur.

Merci Vous

EDIT: en utilisant get_user_model() renvoie l'erreur suivante -

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 
+0

Salut @ RA123, j'essaie d'archiver le même problème, mais mon signal personnalisé ne se déclenche pas. Toute suggestion est la bienvenue. Merci d'avance. – slackmart

Répondre

7

Le sender pour la méthode post_migrate est jamais un modèle (personnalisé ou autre), il est l'instance AppConfig pour l'application qui a été installée.

Les docs donnent l'exemple suivant pour connecter votre gestionnaire de signal dans la méthode ready.

from django.apps import AppConfig 
from django.db.models.signals import post_migrate 

def my_callback(sender, **kwargs): 
    # Your specific logic here 
    pass 

class MyAppConfig(AppConfig): 
    ... 

    def ready(self): 
     post_migrate.connect(my_callback, sender=self) 

De même, l'expéditeur pour le signal post_sync_db (notez le signal est dépréciée) est le module contenant les modèles qui ont été installés.

+0

Monsieur, Merci pour votre réponse, cela a fonctionné parfaitement et pardonnez-moi mon ignorance car je croyais pouvoir utiliser le post_migrate comme les autres signaux. – RA123

+1

Salut @Alasdair, j'essaie d'archiver le même problème, mais mon signal personnalisé ne se déclenche pas. Toute suggestion est la bienvenue. Merci d'avance. – slackmart

+0

@sgmart s'il vous plaît poser une nouvelle question plutôt que d'ajouter un commentaire à une vieille question. – Alasdair