Ok, das ist schon ein kryptischer Titel aber es ist etwas ganz Einfaches gemeint.
Djangos newforms Formulare lassen sich auf einfache und schnelle Weise mit den Methoden as_ul(), as_p() und as_table() ausgeben. Leider werden die Felder dann aber der Reihe nach ausgegeben, einen Zwischentitel oder ähnliches einzufügen ist dann nicht mehr möglich.
<ol>
{{ form.as_ul }}
</ol>
Angenommen im Formular befinden sich folgende Felder:
- username
- emailadresse
- passwort
- passwort (wiederholung)
- Vorname
- Nachname
- Homepage-URL
Wobei die ersten 4 Felder Pflichtfelder sind, die letzten 3 aber optional. Über diese letzten 3 Felder möchte ich eine Titelzeile "Die folgenden Felder sind optional" setzen.
Nun ist es einfacher weise möglich, das Formular per Hand aufzubauen:
<ol>
<li>
<label>{{ form.username.label_tag }}</label>
{{ form.username }}
{{ form.username.help_text}}
</li>
...
<li class="title">Die folgenden Felder sind optional</li>
<li>
<label>{{ form.first_name.label_tag }}</label>
{{ form.first_name }}
{{ form.first_name.help_text}}
</li>
...
</ol>
Sicherlich erreicht man so die maximale Flexibilität aber es ist auch fehleranfällig wenn sich ein Feld(name) ändert und es muss immer Hand angelegt werden, wenn ein neues Feld hinzukommt oder entfernt wird. Also zurück zu den direkten Formular Ausgabemethoden:
<ol>
{{ form.as_ul }}
</ol>
Über die Felder im Formular lässt sich auch iterieren! form.as_ul() ist in der Ausgabe identisch zu diesem Schnipsel:
{{ form.non_field_errors }}
{% for field in form %}
<li>
{% if field.errors %}{{ field.errors }}{% endif %}
{{ field.label_tag }}
{{ field }}
{% if field.help_text %}{{ field.help_text }}{% endif %}
</li>
{% endfor %}
Ich wollte ja über die letzten 3 Felder eine Titelzeile "Die folgenden Felder sind optional" setzen. Das erste der 3 Felder ist "Vorname" und da wir wissen wie dieses Feld heißt, können wir auch darauf prüfen.
{{ form.non_field_errors }}
{% for field in form %}
{% ifequal field.label "First name" %}
<li class="spacer">
Die folgenden Felder sind optional.
</li>
{% endifequal %}
<li>
{% if field.errors %}{{ field.errors }}{% endif %}
{{ field.label_tag }}
{{ field }}
{% if field.help_text %}{{ field.help_text }}{% endif %}
</li>
{% endfor %}
Auf diese Weise lassen sich einfach Daten vor, nach oder selbst in bestimmte Felder einfügen -- ohne dass die Flexibilität von newforms Formularen gefährdet ist.
Arthur June 17, 2008
Sehr guter Artikel — hatte sowas bisher immer "per hand" aufgebaut.
Jannis Leidel June 17, 2008
Super Artikel der mal wieder beweist: die einfachsten Lösungen sind immer die schönsten. Danke, Martin!
Marcel June 19, 2008
sehr guter Beitrag! war die erste seite die ich gefunden habe und hat mir auf anhieb weitergeholfen.
viele grüße
max lössberger July 5, 2008
wow..toller beitrag..endlich gibts auch mal wieder richtig gute artikel, mit denen man auch was anfangen kann