Bienvenue sur IndexError.

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

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,892 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)

...