J'ai un modèle UserProfile étendu dans django:Création d'un profil d'utilisateur étendu
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
#other things in that profile
Et signals.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 fais que le signal est enregistré en ayant dans mon __init__.py
:
import signals
Donc, cela devrait créer un nouveau UserProfile pour chaque utilisateur qui enregistre, rig ht? Mais ce n'est pas le cas. Je reçois toujours des erreurs "UserProfile matching query does not exists" lorsque j'essaie de me connecter, ce qui signifie que l'entrée de la base de données n'est pas là.
Je devrais dire que j'utilise django-registration, qui fournit le signal enregistré par l'utilisateur. La structure des applications importantes pour cela est, que j'ai une application appelée "utilisateurs", j'ai là: models.py, signals.py, urls.py et views.py (et d'autres choses qui devraient c'est important ici). La classe UserProfile est définie dans models.py.
Mise à jour: J'ai changé le signals.py à:
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":
"colonne user_id n'est pas unique"
Édition 2:
Je l'ai trouvé. On dirait que j'ai enregistré le signal deux fois. La solution de contournement pour ce qui est décrit ici: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave
je devais ajouter un dispatch_uid, maintenant mon signals.py ressemble à ceci et travaille:
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")
Pouvez-vous poster la structure de votre application django. Je suis curieux de connaître quelques lignes dans votre code comme 'profile = user.models.UserProfile()' - avez-vous un module nommé 'user'? Où est UserProfile() situé. – czarchaic
c'est les utilisateurs, je ne sais pas comment cette faute de frappe est arrivée, mais le problème est le même. Je me demande pourquoi python n'a pas jeté une erreur pour le chemin mal orthographié. – Kai
merci pour cette solution, im nouveau avec django, et je ne sais pas comment enregistrer d'autres données sur le profil de l'utilisateur. Je vois que vous venez de sauvegarder l'utilisateur dans le modèle UserProfile, mais comment enregistrer les données d'autres (en utilisant votre signals.py) à partir du formulaire d'inscription? Thansk (désolé avec l'anglais) – Asinox