2015-08-11 30 views
5

Di seguito è riportato il mio codice nel file signals.py inserito nel pacchetto in cui è definito il modello auth.in django 1.8, come impostare il mittente per il ricevitore del segnale post_migrate e post_syncdb quando viene impostato un modello utente personalizzato?

@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 documentazione (https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#referencing-the-user-model) afferma che dovrebbe essere impostato come

sender=settings.AUTH_USER_MODEL 

mentre questo funziona solo per post_save come detto nell'esempio documentazione.

Ho già provato get_user_model() e anche direttamente con i my_custom_user.models.

get_user_model() restituisce un errore, durante l'impostazione modelli come mittente funziona bene, come -

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

Ma secondo la documentazione non è questo il modo giusto per fare riferimento un modello di utente personalizzato ed è solo una brutta soluzione.

Qualcuno potrebbe essere in grado di aiutarmi con una soluzione in modo da poter aggiungere questi gruppi con la prima migrazione del modello utente.

Thank You

EDIT: usando get_user_model() restituisce il seguente errore -

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

Ciao @ RA123, sto cercando di archiviare lo stesso problema, ma il mio segnale personalizzato non viene attivato. Qualsiasi suggerimento è benvenuto. Grazie in anticipo. – slackmart

risposta

7

Il sender per il metodo post_migrate non è mai un modello (personalizzato o altro), è l'istanza AppConfig per l'app che è stata installata.

I documenti forniscono il seguente esempio per il collegamento del gestore di segnale nel metodo 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) 

Analogamente, il mittente per post_sync_db segnale (notare che il segnale è sconsigliato) è il modulo contenente i modelli che sono stati installati.

+0

Signore, grazie per la sua risposta, ha funzionato perfettamente e mi ha perdonato per la mia ignoranza poiché credevo di poter usare il post_migrate come gli altri segnali. – RA123

+1

Ciao @Alasdair, sto cercando di archiviare lo stesso problema, ma il mio segnale personalizzato non viene licenziato. Qualsiasi suggerimento è benvenuto. Grazie in anticipo. – slackmart

+0

@sgmart si prega di fare una nuova domanda piuttosto che aggiungere un commento a una vecchia domanda. – Alasdair