Kurzer und schmerzloser Tipp für zwischendurch: Wie kann man in einem
NewForms-Formular dynamisch Felder hinzufügen?
Abstraktion
Am einfachsten per Abstraktion. Das Formular mit den weiteren Feldern leitet sich einfach vom Basisformular ab:
from django import forms
class Userform(forms.Form):
username = forms.CharField()
passwort = forms.CharField(widget=forms.PasswordInput(render_value=False))
class UserformKontaktdaten(Userform):
# ^ Abgeleitet von Userform
vorname = forms.CharField()
nachname = forms.CharField()
Ausgabe:
>>> f = Userform()
>>> print f.as_ul()
<li><label for="id_username">Username:</label> <input type="text" name="username" id="id_username" /></li>
<li><label for="id_passwort">Passwort:</label> <input type="password" name="passwort" id="id_passwort" /></li>
>>> f = UserformKontaktdaten()
>>> print f.as_ul()
<li><label for="id_username">Username:</label> <input type="text" name="username" id="id_username" /></li>
<li><label for="id_passwort">Passwort:</label> <input type="password" name="passwort" id="id_passwort" /></li>
<li><label for="id_vorname">Vorname:</label> <input type="text" name="vorname" id="id_vorname" /></li>
<li><label for="id_nachname">Nachname:</label> <input type="text" name="nachname" id="id_nachname" /></li>
Laufzeitabhängig
Möchte man die Felder aber schon während der Formulargenerierung dynamisch hinzufügen, überschreibt man einfacherweise den Konstruktor und legt die fügt die neuen Felder zu den bestehenden hinzu:
class Userform(forms.Form):
username = forms.CharField()
passwort = forms.CharField(widget=forms.PasswordInput(render_value=False))
def __init__(self, kontaktdaten=False, *args, **kwargs):
super(Userform, self).__init__(*args, **kwargs)
# Hier dynamisch Felder hinzufuegen
if kontaktdaten:
self.fields['vorname'] = forms.CharField()
self.fields['nachname'] = forms.CharField()
Ausgabe:
>>> f = Userform()
>>> print f.as_ul()
<li><label for="id_username">Username:</label> <input type="text" name="username" id="id_username" /></li>
<li><label for="id_passwort">Passwort:</label> <input type="password" name="passwort" id="id_passwort" /></li>
>>> f = Userform(kontaktdaten=True)
>>> print f.as_ul()
<li><label for="id_username">Username:</label> <input type="text" name="username" id="id_username" /></li>
<li><label for="id_passwort">Passwort:</label> <input type="password" name="passwort" id="id_passwort" /></li>
<li><label for="id_vorname">Vorname:</label> <input type="text" name="vorname" id="id_vorname" /></li>
<li><label for="id_nachname">Nachname:</label> <input type="text" name="nachname" id="id_nachname" /></li>
Comments closed
Sorry, new comments are no longer allowed for this entry.
Write me an email if you have feedback or any questions regarding this post. If you found this post useful and just want to say thank you then don't forget that I have an Amazon Wishlist. :-)