J'ai un modèle UserProfile étendu dans django :
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
#other things in that profile
Et un signal.py :
from registration.signals import user_registered
from models import UserProfile
from django.contrib.auth.models import User
def createUserProfile(sender, instance, **kwargs):
profile = users.models.UserProfile()
profile.setUser(sender)
profile.save()
user_registered.connect(createUserProfile, sender=User)
Je m'assure que le signal est enregistré en plaçant ceci dans mon fichier __init__.py
:
import signals
Cela devrait donc me permettre de créer un nouveau UserProfile pour chaque utilisateur qui s'inscrit, non ? Mais ce n'est pas le cas. Je reçois toujours l'erreur "UserProfile matching query does not exist" lorsque j'essaie de me connecter, ce qui signifie que l'entrée dans la base de données n'existe pas.
Je dois dire que j'utilise django-registration, qui fournit le signal user_registered.
La structure des applications importantes pour cela est la suivante : j'ai une application appelée "users", où j'ai : models.py, signals.py, urls.py et views.py (et quelques autres choses qui ne devraient pas avoir d'importance ici). La classe UserProfile est définie dans models.py.
Mise à jour : J'ai changé le signals.py en :
from django.db.models.signals import post_save
from models import UserProfile
from django.contrib.auth.models import User
def create_profile(sender, **kw):
user = kw["instance"]
if kw["created"]:
profile = UserProfile()
profile.user = user
profile.save()
post_save.connect(create_profile, sender=User)
Mais maintenant je reçois un "IntegrityError" :
"La colonne user_id n'est pas unique"
Edit 2 :
Je l'ai trouvé. Il semble que j'ai enregistré le signal deux fois. La solution de contournement pour cela est décrite ici : http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave
J'ai dû ajouter un dispatch_uid, maintenant mon signals.py ressemble à ceci et fonctionne :
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from models import UserProfile
from django.db import models
def create_profile(sender, **kw):
user = kw["instance"]
if kw["created"]:
profile = UserProfile(user=user)
profile.save()
post_save.connect(create_profile, sender=User, dispatch_uid="users-profilecreation-signal")
0 votes
Pourriez-vous afficher la structure de votre application django. Je suis curieux au sujet de quelques lignes dans votre code comme
profile=user.models.UserProfile()
- Avez-vous un module nommé 'user' ? Où se trouve UserProfile() ?0 votes
Ce sont des utilisateurs, je ne sais pas comment cette coquille s'est retrouvée là, mais le problème est le même. Je me demande pourquoi python n'a pas lancé une erreur pour le chemin mal orthographié.
0 votes
Je vois que vous enregistrez simplement l'utilisateur dans le modèle UserProfile, mais comment puis-je enregistrer les données des autres (en utilisant vos signaux.py) à partir du formulaire d'enregistrement ? Merci (désolé pour l'anglais)