Django-fr

Forum

#1 19-11-2011 16:36:48

kinou89
Membre
Inscription : 19-11-2011
Messages : 3

Validation de formulaire

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

#2 19-11-2011 17:51:24

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : Validation de formulaire

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

#3 19-11-2011 18:17:46

kinou89
Membre
Inscription : 19-11-2011
Messages : 3

Re : Validation de formulaire

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

#4 19-11-2011 22:55:04

Laurent VERGEROLLE
Membre
Inscription : 14-11-2011
Messages : 5

Re : Validation de formulaire

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

#5 20-11-2011 21:28:07

kinou89
Membre
Inscription : 19-11-2011
Messages : 3

Re : Validation de formulaire

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

Pied de page des forums