Django-fr

Forum

#1 04-09-2014 11:13:44

Doline
Membre
Inscription : 06-08-2014
Messages : 22

Deux formulaires et deux submit dans la m ême vue

Bonjour,

Je souhaite mettre deux formulaires différents sur une même page.


<form method="post" action="{% url 'creation' %}">{% csrf_token %}

        <ul>
            <li>{{ form1.code.label }} {{ form1.code }}</li>
            <li>{{ form1.nom.label }} {{ form1.nom }}</li>
            <li>{{ form1.pays.label }} {{ form1.pays }}</li>
        </ul>
        {{ form1.errors }}

      <p><input type="submit" value="Enregistrer" name="save1"/></p>
    </form>
   
    <br><br>

   Ajouter un Pays<br>
    <form method="post" action="{% url 'creation' %}">{% csrf_token %}
      {{ form2 }}
      <p><input type="submit" value="Enregistrer" name="save2"/></p>
    </form>

Je souhaite différencier l'action des submits. J'ai donc fait ma vue comme suit :

def clients(request):
    if request.method == 'POST':
        _formClient = ClientForm(request.POST)
        _formPays = PaysForm(request.POST)

        if 'saveClt' in request.POST :
            if _formClient.is_valid():
                _formClient.save()
        if 'savePays' in request.POST :
            if _formPays.is_valid():
                _formPays.save()

    else:
        _formClient = ClientForm()
        _formPays = PaysForm()

    return render(request, 'Clients.html', {
            "form1": _formClient,
            "form2": _formPays,
            })

Malheureusement si je clique sur l'input "lié" à form2 des erreurs apparaîsent dans form1 ... ceci est un peu normal puisque je n'ai rien renseigné, mais en théorie il ne devrait même pas y avoir d'appel, non ?

Je trouvé plusieurs manières de faire ce que je souhaite sur le net, mais pour le moment je n'ai réussi à en faire fonctionner correctement aucune.

Une idée ??? smile

Bon ap' à tous.

Hors ligne

#2 04-09-2014 11:24:49

F. D.V.
Membre
Inscription : 21-07-2016
Messages : 4

Re : Deux formulaires et deux submit dans la m ême vue

C'est normal, lorsque le formulaire est traité, ta vue vérifie également
les infos de l'autre formulaire. Soit tu valides les 2 en même temps. 1
seul bouton.
Soit tu passes par ajax, avec une vue pour chaque bouton

Mais le plus simple de faire une formulaire par page... et encore mieux, si
tu veux que ce soit propre, tu l'ouvres dans une fenêtre modale.



-------------------------------------------
FDV


Le 4 septembre 2014 12:13, Charlie Gentil <ceg _AT_ redaction-developpez.com> a
écrit :

>  Bonjour,
>
>
>
> Je souhaite mettre deux formulaires différents sur une même page.
>
>
>
>
>
> <form method="post" action="{% url 'creation' %}">{% csrf_token %}
>
>
>
> <ul>
>
> <li>{{ form1.code.label }} {{ form1.code }}</li>
>
> <li>{{ form1.nom.label }} {{ form1.nom }}</li>
>
> <li>{{ form1.pays.label }} {{ form1.pays }}</li>
>
> </ul>
>
> {{ form1.errors }}
>
>
>
> <p><input type="submit" value="Enregistrer" name="save1"/></p>
>
> </form>
>
>  <br><br>
>
>
>
> Ajouter un Pays<br>
>
> <form method="post" action="{% url 'creation' %}">{% csrf_token %}
>
> {{ form2 }}
>
> <p><input type="submit" value="Enregistrer" name="save2"/></p>
>
> </form>
>
>
>
> Je souhaite différencier l'action des submits. J'ai donc fait ma vue comme
> suit :
>
>
>
> def clients(request):
>
> if request.method == 'POST':
>
> _formClient = ClientForm(request.POST)
>
> _formPays = PaysForm(request.POST)
>
>
>
> if 'saveClt' in request.POST :
>
> if _formClient.is_valid():
>
> _formClient.save()
>
> if 'savePays' in request.POST :
>
> if _formPays.is_valid():
>
> _formPays.save()
>
>
>
> else:
>
> _formClient = ClientForm()
>
> _formPays = PaysForm()
>
>
>
> return render(request, 'Clients.html', {
>
> "form1": _formClient,
>
> "form2": _formPays,
>
> })
>
>
>
> Malheureusement si je clique sur l'input "lié" à form2 des erreurs
> apparaîsent dans form1 ... ceci est un peu normal puisque je n'ai rien
> renseigné, mais en théorie il ne devrait même pas y avoir d'appel, non ?
>
>
>
> Je trouvé plusieurs manières de faire ce que je souhaite sur le net, mais
> pour le moment je n'ai réussi à en faire fonctionner correctement aucune.
>
>
>
> Une idée ??? smile
>
>
>
> Bon ap' à tous.
>
>
>
>
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 04-09-2014 11:37:13

stopher
Membre
Lieu : Lille
Inscription : 26-09-2011
Messages : 11
Site Web

Re : Deux formulaires et deux submit dans la m ême vue

Sinon, tu peux ajouter un paramètre dans ton url, indiquant dans ta vue,
de quel formulaire il s'agit

<formmethod="post"action="{%url'creation' 'form1'%}">{%csrf_token%}
...
...
<formmethod="post"action="{%url'creation' 'form2'%}">{%csrf_token%}



defclients(request, formUsed=False):

     ....
if formUsed == 'form1':

_form=ClientForm(request.POST)
elif formUsed == 'form2':

_form=PaysForm(request.POST)


if _form.is_valid():
_form.save()
....



Le 04/09/2014 12:13, Charlie Gentil a écrit :
>
> Bonjour,
>
> Je souhaite mettre deux formulaires différents sur une même page.
>
> <formmethod="post"action="{%url'creation'%}">{%csrf_token%}
>
> <ul>
>
> <li>{{form1.code.label}}{{form1.code}}</li>
>
> <li>{{form1.nom.label}}{{form1.nom}}</li>
>
> <li>{{form1.pays.label}}{{form1.pays}}</li>
>
> </ul>
>
> {{form1.errors}}
>
> <p><inputtype="submit"value="Enregistrer"name="save1"/></p>
>
> </form>
>
> <br><br>
>
> AjouterunPays<br>
>
> <formmethod="post"action="{%url'creation'%}">{%csrf_token%}
>
> {{form2}}
>
> <p><inputtype="submit"value="Enregistrer"name="save2"/></p>
>
> </form>
>
> Je souhaite différencier l'action des submits. J'ai donc fait ma vue
> comme suit :
>
> defclients(request):
>
> ifrequest.method=='POST':
>
> _formClient=ClientForm(request.POST)
>
> _formPays=PaysForm(request.POST)
>
> if'saveClt'inrequest.POST:
>
> if_formClient.is_valid():
>
> _formClient.save()
>
> if'savePays'inrequest.POST:
>
> if_formPays.is_valid():
>
> _formPays.save()
>
> else:
>
> _formClient=ClientForm()
>
> _formPays=PaysForm()
>
> returnrender(request,'Clients.html',{
>
> "form1":_formClient,
>
> "form2":_formPays,
>
> })
>
> Malheureusement si je clique sur l'input "lié" à form2 des erreurs
> apparaîsent dans form1 ... ceci est un peu normal puisque je n'ai rien
> renseigné, mais en théorie il ne devrait même pas y avoir d'appel, non ?
>
> Je trouvé plusieurs manières de faire ce que je souhaite sur le net,
> mais pour le moment je n'ai réussi à en faire fonctionner correctement
> aucune.
>
> Une idée ??? smile
>
> Bon ap' à tous.
>
>
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#4 08-09-2014 14:44:01

Doline
Membre
Inscription : 06-08-2014
Messages : 22

Re : Deux formulaires et deux submit dans la m ême vue

Bonjour,

N'ayant pas eu de réponse à ma question ci-dessous je me permets de la reposer mais légèrement différemment.
Ce que je cherche à faire pourrait être comparé à la gestion de deux submits dans un même formulaire.

Le premier pour enregistrer les valeurs du formulaire dans la BDD, le deuxième pour réinitialiser celui-ci.

D'après ce que j'ai pu voir dans la doc et sur le net, poser une condition if sur l'un des tag de l'input devrait permettre de faire ceci. Malheureusement je n'y suis pas encore parvenu.

Une petite idée ???

D'avance merci.



Bonjour,

Je souhaite mettre deux formulaires différents sur une même page.


<form method="post" action="{% url 'creation' %}">{% csrf_token %}

        <ul>
            <li>{{ form1.code.label }} {{ form1.code }}</li>
            <li>{{ form1.nom.label }} {{ form1.nom }}</li>
            <li>{{ form1.pays.label }} {{ form1.pays }}</li>
        </ul>
        {{ form1.errors }}

      <p><input type="submit" value="Enregistrer" name="save1"/></p>
    </form>
   
    <br><br>

   Ajouter un Pays<br>
    <form method="post" action="{% url 'creation' %}">{% csrf_token %}
      {{ form2 }}
      <p><input type="submit" value="Enregistrer" name="save2"/></p>
    </form>

Je souhaite différencier l'action des submits. J'ai donc fait ma vue comme suit :

def clients(request):
    if request.method == 'POST':
        _formClient = ClientForm(request.POST)
        _formPays = PaysForm(request.POST)

        if 'saveClt' in request.POST :
            if _formClient.is_valid():
                _formClient.save()
        if 'savePays' in request.POST :
            if _formPays.is_valid():
                _formPays.save()

    else:
        _formClient = ClientForm()
        _formPays = PaysForm()

    return render(request, 'Clients.html', {
            "form1": _formClient,
            "form2": _formPays,
            })

Malheureusement si je clique sur l'input "lié" à form2 des erreurs apparaîsent dans form1 ... ceci est un peu normal puisque je n'ai rien renseigné, mais en théorie il ne devrait même pas y avoir d'appel, non ?

Je trouvé plusieurs manières de faire ce que je souhaite sur le net, mais pour le moment je n'ai réussi à en faire fonctionner correctement aucune.

Une idée ??? smile

Bon ap' à tous.

Hors ligne

#5 08-09-2014 14:53:25

Rémy HUBSCHER
Membre
Inscription : 11-08-2010
Messages : 161

Re : Deux formulaires et deux submit dans la m ême vue

Pour faire un reset tu n'as normalement pas besoin d'un bouton submit.
Un bouton reset devrait suffire.

<input type="reset" value="reset">

c.f: https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input

Pour mettre deux submit dans un formulaire, il faut leur donner un nom.

    <form action="/todo" method="POST">
       <input type="submit" *name="save"* value="Sauvegarder">
       <input type="submit" *name="save_and_add"* value="Sauvegarder et
    ajouter un nouveau">
    </form>


On obtiendra save=Sauvegarder ou
save_and_add=Sauvegarder%20et%20ajouter%20un%20nouveau
Comme variable POST ce qui permet de différencier lequel des boutons a
été cliqué.

    if "save" in self.POST:
        # save
    elif "save_and_add" in self.POST:
        # save_and_add


En espérant que ça t'aide.

Rémy

Hors ligne

#6 08-09-2014 15:02:49

Galia Weiss
Membre
Inscription : 21-07-2016
Messages : 1

Re : Deux formulaires et deux submit dans la m ême vue

Pourra tu ajouter un
print request.POST
dans la view

comme ça tu pourra voir ce qui arrive vraiment
Mais en gros ta demarche devrait marcher, on peut avoir deux Forms dans un
view et valider que un en utilisant un if
Par contre j'ai du mal à voir si ton *indentation* est correct (elle a
l'air fosse, mais je pense que ce le mail ...)
Galia

2014-09-08 15:53 GMT+02:00 Rémy Hubscher <hubscher.remy _AT_ gmail.com>:

>  Pour faire un reset tu n'as normalement pas besoin d'un bouton submit.
> Un bouton reset devrait suffire.
>
> <input type="reset" value="reset">
>
> c.f: https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input
>
> Pour mettre deux submit dans un formulaire, il faut leur donner un nom.
>
> <form action="/todo" method="POST">
>    <input type="submit" *name="save"* value="Sauvegarder">
>    <input type="submit" *name="save_and_add"* value="Sauvegarder et
> ajouter un nouveau">
> </form>
>
>
> On obtiendra save=Sauvegarder ou
> save_and_add=Sauvegarder%20et%20ajouter%20un%20nouveau
> Comme variable POST ce qui permet de différencier lequel des boutons a été
> cliqué.
>
> if "save" in self.POST:
>     # save
> elif "save_and_add" in self.POST:
>     # save_and_add
>
>
> En espérant que ça t'aide.
>
> Rémy
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#7 08-09-2014 16:39:08

Doline
Membre
Inscription : 06-08-2014
Messages : 22

Re : Deux formulaires et deux submit dans la m ême vue

Salut et merci à vous deux.

Alors pour commencer je confirme que le problème d'indentation vient bien du mail. Dans mon code c'est propre.

@Rémy :
C'est la solution que j'essaye (je m'aperçois que j'ai mal recopié le code dans ma première demande wink )
Voici ma fonction dans views.py :

        if 'save1' in request.POST :
            if _formClient.is_valid():
                _formClient.save()
                print(request.POST)
        if 'save2' in request.POST :
            if _formPays.is_valid():
                _formPays.save()
                print(request.POST)


où save1 et save2 sont les attributs des "name" de chaque input (2 formulaires donc deux inputs dans la même page).



@Galia :
En gros sur ma page j'ai un formulaire pour enregistrer un client et un pour ajouter un pays.
Si je souhaite enregistrer un pays c'est save2 qui devrait être dans request.POST. Voici donc le résultat de print(request.POST) :
<QueryDict: {'pays': ['ANGLETERRE'], 'savePays': ['Enregistrer']>.

Donc jusque là tout est normal. De plus le pays s'enregistre bien.
Cependant j'ai aussi une erreur qui me dit que les champs de l'autre formulaire sont manquants... (voir PJ).

Je vais essayer de mettre deux *2 inputs dans 1 seul formulaire* et de volontairement différencier l'action pour voir si ça fonctionne correctement dans ce cas là.

Merci de votre aide.





Pourra tu ajouter un
print request.POST
dans la view


comme ça tu pourra voir ce qui arrive vraiment
Mais en gros ta demarche devrait marcher, on peut avoir deux Forms dans un view et valider que un en utilisant un if
Par contre j'ai du mal à voir si ton *indentation* est correct (elle a l'air fosse, mais je pense que ce le mail ...)
Galia


2014-09-08 15:53 GMT+02:00 Rémy Hubscher <hubscher.remy _AT_ gmail.com[1]>:


Pour faire un reset tu n'as normalement pas besoin d'un bouton submit.Un bouton reset devrait suffire.

<input type="reset" value="reset">

c.f: https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input[2]

<form action="/todo" method="POST">   <input type="submit" *name="save"* value="Sauvegarder">   <input type="submit" *name="save_and_add"* value="Sauvegarder et ajouter un nouveau"></form>


save=Sauvegarder ou save_and_add=Sauvegarder%20et%20ajouter%20un%20nouveau

if "save" in self.POST:    # saveelif "save_and_add" in self.POST:    # save_and_add




django _AT_ lists.afpy.org[3]
http://lists.afpy.org/mailman/listinfo/django[4]

Hors ligne

#8 08-09-2014 19:12:04

Doline
Membre
Inscription : 06-08-2014
Messages : 22

Re : Deux formulaires et deux submit dans la m ême vue

Re,

Bon j'ai fait un test avec deux input dans le même formulaire. Du coté de views.py ça donne ça :

if _formClient.is_valid():
    if 'save1' in request.POST :
        _formClient.save()
        print(request.POST)
    if 'save2' in request.POST :
        retourClient = _formClient.save(commit=False)
        retourClient.code = "toto2"
        retourClient.save()
        print(request.POST)


et là ça fonctionne parfaitement bien. Question : deux formulaires dans la même views.py c'est possible ?

++

Charlie




Salut et merci à vous deux.

Alors pour commencer je confirme que le problème d'indentation vient bien du mail. Dans mon code c'est propre.

@Rémy :
C'est la solution que j'essaye (je m'aperçois que j'ai mal recopié le code dans ma première demande wink )
Voici ma fonction dans views.py :

        if 'save1' in request.POST :
            if _formClient.is_valid():
                _formClient.save()
                print(request.POST)
        if 'save2' in request.POST :
            if _formPays.is_valid():
                _formPays.save()
                print(request.POST)


où save1 et save2 sont les attributs des "name" de chaque input (2 formulaires donc deux inputs dans la même page).



@Galia :
En gros sur ma page j'ai un formulaire pour enregistrer un client et un pour ajouter un pays.
Si je souhaite enregistrer un pays c'est save2 qui devrait être dans request.POST. Voici donc le résultat de print(request.POST) :
<QueryDict: {'pays': ['ANGLETERRE'], 'savePays': ['Enregistrer']>.

Donc jusque là tout est normal. De plus le pays s'enregistre bien.
Cependant j'ai aussi une erreur qui me dit que les champs de l'autre formulaire sont manquants... (voir PJ).

Je vais essayer de mettre deux *2 inputs dans 1 seul formulaire* et de volontairement différencier l'action pour voir si ça fonctionne correctement dans ce cas là.

Merci de votre aide.





Pourra tu ajouter un
print request.POST
dans la view


comme ça tu pourra voir ce qui arrive vraiment
Mais en gros ta demarche devrait marcher, on peut avoir deux Forms dans un view et valider que un en utilisant un if
Par contre j'ai du mal à voir si ton *indentation* est correct (elle a l'air fosse, mais je pense que ce le mail ...)
Galia


2014-09-08 15:53 GMT+02:00 Rémy Hubscher <hubscher.remy _AT_ gmail.com[1]>:


Pour faire un reset tu n'as normalement pas besoin d'un bouton submit.Un bouton reset devrait suffire.

<input type="reset" value="reset">

c.f: https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input[2]

<form action="/todo" method="POST">   <input type="submit" *name="save"* value="Sauvegarder">   <input type="submit" *name="save_and_add"* value="Sauvegarder et ajouter un nouveau"></form>


save=Sauvegarder ou save_and_add=Sauvegarder%20et%20ajouter%20un%20nouveau

if "save" in self.POST:    # saveelif "save_and_add" in self.POST:    # save_and_add




django _AT_ lists.afpy.org[3]
http://lists.afpy.org/mailman/listinfo/django[4]

Hors ligne

Pied de page des forums