Vous n'êtes pas identifié(e).
Bonjour à tous,
Je suis nouveau sur Django et je rencontre un problème pour mon formulaire d'inscription. Voici la situation:
J'ai un model utilisateur qui "extends" le User de base de Django via une foreign key. Pour faire mon inscription j'ai en réalité utilisé deux formulaires: l'un pour le model User et l'autre pour mes champs supplémentaires dans le model Utilisateur de ma fabrication. J'affiche donc dans ma vue ses deux formulaires, jusque là pas de problème. Un peu de code pour mieux comprend la situation:
fichier forms.py
class UserForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'email', )
class UtilisateurForm(ModelForm):
class Meta:
model = Utilisateur
widgets = { 'user': forms.widgets.HiddenInput, }
fichier views.py
def register_view(request):
if request.method == 'POST':
user_form = UserForm(request.POST)
utilisateur_form = UtilisateurForm(request.POST)
if user_form.is_valid():
new_user = user_form.save()
utilisateur_form.user = new_user
if utilisateur_form.is_valid():
utilisateur_form.save()
return HttpResponseRedirect("/")
else:
user_form = UserForm()
utilisateur_form = UtilisateurForm()
return render_to_response("utilisateur/register.html", {'user_form': user_form, 'utilisateur_form': utilisateur_form,})
Cependant je n'arrive pas assigner au champ "user_id" de mon model Utilisateur le nouveau User fraichement créé après validation du premier formulaire, et j'obtiens systématiquement l'erreur "ce champ est obligatoire"
Quelqu'un aurait il la solution à mon problème, car la y'a quelque chose qui m'échappe ?
Hors ligne
Ton modèle Utilisateur doit déclarer une foreign key en autorisant une valeur nulle :
user = ForeignKey(User, null=True, blank=True) #et eventuellement unique=True
sinon, utilisateur_form.is_valid() ne peut pas réussir puisque la clé est obligatoire pour la création du modèle Utilisateur.
Hors ligne
J'ai changer mon model selon tes conseils:
class Utilisateur(models.Model):
#User_Auth de Django
user = models.ForeignKey(User, null=True, blank=True, unique=True)
#Ajout de nos champs perso
avatar = models.ImageField(upload_to=settings.IMAGE_UPLOAD_PATH, null=False)
points = models.IntegerField(null=False)
dateNaissance = models.DateField(null=False)
pays = models.CharField(max_length=45, null=False)
sexeM = models.BooleanField(null=False)
Donc, très bien je n'ai plus mon message pour le champ obligatoire (logique) mais ma valeur de foreign key n'est toujours pas mise à jour comme il faut, j'ai systématiquement NULL dans le champ. Ai-je le droit d'assigner "à la volée" une valeur au formulaire (voir code de mon 1er post) ?
Hors ligne
Bonjour Kinou,
Maintenant que tu as mis ton user à null dans le model ça te retire
l'erreur mais ça n'arrange pas le problème. Faut que tu complète ta view
comme ceci :
fichier views.py
def register_view(request):
if request.method == 'POST':
user_form = UserForm(request.POST)
utilisateur_form = UtilisateurForm(request.POST)
if user_form.is_valid():
new_user = user_form.save()
if utilisateur_form.is_valid():
u = utilisateur_form.save()
u.user = new_user
u.save()
return HttpResponseRedirect("/")
else:
user_form = UserForm()
utilisateur_form = UtilisateurForm()
return render_to_response("utilisateur/register.html",
{'user_form':user_form, 'utilisateur_form': utilisateur_form,})
En fait tu enregistre ton model Utilisateur avec un user = null puis tu
surcharge user avec new_user.
Perso je trouve pas tout ça très propre. Je te conseil de revoir ta
méthode. Il y'a d'autre solution plus élégantes je pense comme :
Dans ton models.py tu laisse le user obligatoire pour la class Utilisateur
et tu mets ceci dans ton forms.py:
forms.py
class UserForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'email', )
class UtilisateurForm(ModelForm):
class Meta:
model = Utilisateur
exclude = ('user',)
Tu exclus le user pour que ça validation ne te pose pas de problème. En
fait là on va se servir du ModelForm comme d'un Form normal
views.py
def register_view(request):
if request.method == 'POST':
user_form = UserForm(request.POST)
utilisateur_form = UtilisateurForm(request.POST)
if user_form.is_valid() and utilisateur_form.is_valid():
u = Utilisateur(**utilisateur_form.cleaned_data)
u.user = user_form.save()
u.save()
return HttpResponseRedirect("/")
else:
user_form = UserForm()
utilisateur_form = UtilisateurForm()
return render_to_response("utilisateur/register.html",
{'user_form':user_form, 'utilisateur_form': utilisateur_form,})
Là après la validation des 2 formulaires, on intialise un Utilisateur avec
les valeur du utilisateur_form, on stock le user dans l'Utilsateur créé et
on save l'Utilisateur.
Avec cette méthode tu n'auras pas de création de User si ton
utilisateur_form n'est pas valide et tu pourra garder ton model propre.
En espérant que ça t'aide et que tu t'amuses autant que moi avec django
Laurent Vergerolle
http://www.gwadalug.org/
Le 19 novembre 2011 13:17, kinou89 <kinou7789 _AT_ hotmail.fr> a écrit :
> J'ai changer mon model selon tes conseils:
>
>
> class Utilisateur(models.Model):
> #User_Auth de Django
> user = models.ForeignKey(User, null=True, blank=True, unique=True)
>
> #Ajout de nos champs perso
> avatar = models.ImageField(upload_to=settings.IMAGE_UPLOAD_PATH,
> null=False)
> points = models.IntegerField(null=False)
> dateNaissance = models.DateField(null=False)
> pays = models.CharField(max_length=45, null=False)
> sexeM = models.BooleanField(null=False)
>
>
> Donc, très bien je n'ai plus mon message pour le champ obligatoire
> (logique) mais ma valeur de foreign key n'est toujours pas mise à jour
> comme il faut, j'ai systématiquement NULL dans le champ. Ai-je le droit
> d'assigner "à la volée" une valeur au formulaire (voir code de mon 1er
> post) ?
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>
Hors ligne
Merci beaucoup Laurent,
Cela marche super bien. En plus tu as raison, cette technique est propre, je n'y avais pas pensé. Je ne suis pas encore tout à fait à l'aise avec le fait de voir les éléments HTML comme des objets issues de classes. En passant je ne connaissait pas cette syntaxe avec les deux étoiles ** dans l'appel au constructeur.
Encore merci.
Bonne continuation
Hors ligne