[python] Fügen Sie ein Feld dynamisch zu einem Formular hinzu



1 Answers

Ich hatte einen Fall, als ich dynamisch dynamische Formulare erstellen musste. Das habe ich mit diesem Trick gemacht:

from django import forms

...

dyn_form = type('DynForm',  # form name is irrelevant
                (forms.BaseForm,),
                {'base_fields': fields})

Weitere Informationen finden Sie unter diesem Link: Dynamische Formulare

Aber zusätzlich musste ich auch Felder einfügen, dh dynamisch Felder zu einer Formularklasse hinzufügen, sobald sie erstellt wurde.

dyn_form.base_fields['field1'] = forms.IntegerField(widget=forms.HiddenInput(), initial=field1_val)
dyn_form.base_fields['field2'] = forms.CharField(widget=forms.HiddenInput(), initial=field2_val)

Und das hat funktioniert.

Question

Ich habe 3 Felder in meiner Form. Ich habe eine Absenden-Schaltfläche und eine Schaltfläche "Zusätzliches Feld hinzufügen". Ich verstehe, dass ich Felder mit __init__ Methode in der Formularklasse hinzufügen kann.

Ich bin neu bei Python und Django und stecke mit einer Anfängerfrage fest: Meine Frage ist:

Wenn ich auf die Schaltfläche "Zusätzliches Feld hinzufügen" klicke, wie wird das zusätzliche Feld hinzugefügt?

Muss das Formular erneut gerendert werden?

Wie und wann rufe ich __init__ oder muss ich es sogar anrufen?

Wie übergebe ich Argumente an __init__ ?




Ein Weg ohne Javascript und der Feldtyp ist in der js nicht beschrieben:

PYTHON

 def __init__(self, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)

        ##ajouts des champs pour chaque chien
        for index in range(int(nb_dogs)):
            self.fields.update({
                'dog_%s_name' % index: forms.CharField(label=_('Name'), required=False, max_length=512),
            })

 def fields_dogs(self):
        fields = []
        for index in range(int(nb_dogs)):
            fields.append({
                'name': self['dog_%s_name' % index],
            })
        return fields

VORLAGE

{% for field_dog in f.fields_dogs %}
        <thead>
            <tr>
                <th style="background-color: #fff; border-width: 0px;"></th>
                <th>{% trans 'Dog' %} #{{forloop.counter}}</th>
                <th>{% trans 'Name' %}</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td style="background-color: #fff; border-width: 0px;"></td>
                <td style="background-color: #fff; border-width: 0px;"></td>
                <td>{{field_dog.name.errors}}{{field_dog.name}}</td>
            </tr>
            <tr>
                <td style="padding: 10px; border-width: 0px;"></td>
            </tr>
        </tbody>
{% endfor %}



Related