2017-09-30 5 views
0

Chaque fois qu'une nouvelle instance d'utilisateur est créée, je souhaite créer une instance de profil qui lui est liée. Pour ce faire, j'essaie d'utiliser des signaux.Le signal de post-sauvegarde n'est pas appelé dans Django

est ici le code de models.py:

@receiver(post_save, sender=User) 
def create_user_profile(sender,**kwargs): 
    print(sender) 

Et voici de view.py:

@api_view(["POST"]) 
def register(request): 
    username = request.data.get("username") 
    first_name = request.data.get("first_name") 
    last_name = request.data.get("last_name") 
    email = request.data.get("email") 
    password1 = request.data.get("password1") 
    password2 = request.data.get("password2") 

    user = User.objects.create_user(username,email,password1) 

    if user: 
     user = authenticate(username=username, password=password1) 

    if not user: 
     return Response({"error": "Login failed"}, status=HTTP_401_UNAUTHORIZED) 

    token, _ = Token.objects.get_or_create(user=user) 
    return Response({"token": token.key}) 

Cependant, rien est imprimé à mon terminal lors de la création d'un nouvel utilisateur.

EDIT: Je déplacé la fonction à signals.py et édité apps.py mais il ne fonctionne toujours pas:

from django.apps import AppConfig 

class AuthConfig(AppConfig): 
    name = 'auth' 
    verbose_name = 'Auth Application' 

    def ready(self): 
     from . import signals 

et voici __init__.py:

default_app_config = 'auth.apps.AuthConfig' 
+0

Quel est l'emplacement de votre fonction create_user_profile à l'intérieur de votre models.py – iklinac

+0

@iklinac Juste en dessous de la classe de modèle Profile – dpstart

+0

@dpstart Elle doit être soit en dessous du modèle utilisateur et non du modèle de profil, ou (comme je le préfère) doit être dans un fichier d'écoute séparé lié de manière appropriée via AppConfig – kushj

Répondre

-1

En général, la question est signals.py hasn » t été importé, you need to add it to your AppConfig comme mentionné dans les commentaires:

# apps.py 

# or whatever the class is called inside the app containing signals.py 
class RegistrationConfig(AppConfig): 
    name = 'registration' 

    # This is the piece you will need to add 
    def ready(self): 
     from . import signals 
+0

Je l'ai fait mais cela ne fonctionne pas de toute façon (j'ai édité la question) – dpstart

+0

Assurez-vous que dans votre fichier settings.py, vous installez le paquet en utilisant la classe apps.py config, et non le module lui-même. Cela signifie INSTALLED_APPS = ["module.apps.RegistrationConfig"] – jonzlin95

+0

Ceci n'est pas nécessaire. De plus, votre lien vers les docs Django ne le dit pas. – olieidel