2015-08-11 9 views
5

Poniżej znajduje się mój kod w pliku signals.py umieszczonym w pakiecie, w którym zdefiniowano model auth.w django 1.8, jak ustawić nadawcę dla odbiornika sygnału post_migrate i post_syncdb, gdy ustawiony jest niestandardowy model użytkownika?

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

Dokumentacja (https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#referencing-the-user-model) stwierdza, że ​​powinna ona być ustawiona jako

sender=settings.AUTH_USER_MODEL 

natomiast działa to tylko dla post_save jak wspomniano w przykładzie dokumentacji.

Ja już próbowałem get_user_model() a także bezpośrednio za pomocą my_custom_user.models.

get_user_model() zwróci błąd podczas ustawiania modeli jako nadawca działa tak samo dobrze, jak -

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

Ale według dokumentacji nie jest to właściwy sposób odnieść niestandardowy model użytkownika i jest po prostu brzydkie obejście.

Czy ktoś mógłby mi pomóc w rozwiązaniu problemu, dzięki czemu mogę dodać te grupy przy pierwszej migracji modelu użytkownika.

Dziękuję

EDIT: przy użyciu get_user_model() zwraca następujący błąd -

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

Witam @ RA123, próbuję zarchiwizować ten sam problem, ale mój sygnał niestandardowy nie zostanie zwolniony. Wszelkie sugestie są mile widziane. Z góry dziękuję. – slackmart

Odpowiedz

7

sender dla metody post_migrate nie jest model (na zamówienie lub w inny sposób), to instancja AppConfig dla aplikacja, która została zainstalowana.

Dokumenty podają następujący przykład podłączenia procesora sygnału w metodzie 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) 

Podobnie, nadawca dla post_sync_db sygnału (uwaga sygnał jest przestarzała) jest moduł zawierający modele, które zostały zainstalowane.

+0

Panie, dziękuję za odpowiedź, zadziałało idealnie i wybaczyło mi moją ignorancję, ponieważ wierzyłem, że mogę wykorzystać post_migrate jak inne sygnały. – RA123

+1

Hi @Alasdair, próbuję zarchiwizować ten sam problem, ale mój sygnał niestandardowy nie zostanie zwolniony. Wszelkie sugestie są mile widziane. Z góry dziękuję. – slackmart

+0

@sgmart, proszę zadać nowe pytanie, zamiast dodawać komentarze do starego pytania. – Alasdair

Powiązane problemy