Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Django - Formulaire multiple

+1 vote

J'ai une APP qui me permet de calculer des distance entre 2 lieux.
En fonction du résultat de mon algorithme de calcul je peux avoir entre 1 et +de 12 résultats.
Mon modele contient 3 champs (lieu1, lieu2, distance)
je souhaite avoir un formulaire qui me permette de remplir ce model.


exemple:
résultat de l'algorithme:

lieu 1 -> lieu 2 : 400 kilomètres
lieu 1 -> lieu 2 : 389 kilomètres
lieu 1 -> lieu 2 : 405 kilomètres

Je voudrai insérer les 3 valeurs. Actuellement, ça ne fonctionne pas. Je peux sélectionner qu'une valeur.


form.py :

class link_distanceForm(forms.ModelForm):
    class Meta:
        model = link_distance
        fields = ('depart', arrivee', distance')

form.html:

<form method="POST" class="">{% csrf_token %}
{% for element in link_distance %}
<input type="checkbox" name="distance" value="{{ element.id }}"></input>
<input type="checkbox" name="distance"value="{{ element.id }}"></input>
</form>
demandé 1-Mar-2016 par anonyme

1 Réponse

+2 votes
 
Meilleure réponse

Il suffit de faire un formulaire groupé aka "formset"

un formulaire classique

>>> from django import forms
>>> class ArticleForm(forms.Form):
...     title = forms.CharField()
...     pub_date = forms.DateField()

qui devient un formulaire groupé

>>> from django.forms import formset_factory
>>> ArticleFormSet = formset_factory(ArticleForm)

qu'on initialise avec 2 lignes "vides" pour commencer

>>> ArticleFormSet = formset_factory(ArticleForm, extra=2)

qu'on affiche comme ceci dans le template

<form method="post" action="">
    {{ formset.management_form }}
    <table>
    {% for form in formset %}
    {{ form }}
    {% endfor %}
    </table>
</form>
répondu 1-Mar-2016 par foxmask (2,880 points)
sélectionné 3-Mar-2016 par foxmask

J'ai essayé de suivre ce que tu m'as dis

forms.py:

class link_distanceForm(forms.Form):
    depart = forms.CharField()
    arrivee = forms.CharField()
        distance = forms.CharField()

views.py:

form = formset_factory( link_distanceForm, extra=2)

form.html :

<form method="post" action="">
    <table>
    {% for f in form %}
    {{ f }}
    {% endfor %}
    </table>
</form>

J'arrive à afficher les formulaires comme je le souhaite.(MERCI :D)
Par contre j'aimerai mettre des valeurs par défaut dans mes champs depart et arrivee (des valeurs que je récupère dans mon fichier views.py )

Comment se passe l'envoi de donnée de chaque formulaire ? Comment puis-je récupérer chaque formulaire?

pour initialiser les champs avec une valeur par defaut

from django.views.generic import CreateView
class MaVue(CreateView):
    def get_initial(self):
        """
        Returns the initial data to use for forms on this view.
        """
        data = {"depart": 100, "arrivee": 200 }
        return data

pour enregistrer les données, tout est dit dans la doc à la virgule pres. (notamment form_valid)

...