Zusätzliche Templatedaten in newforms-Formulare einfügen.
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.
1 2 3 | <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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <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:
1 2 3 | <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:
1 2 3 4 5 6 7 8 9 | {{ 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | {{ 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.
Geschrieben am: 15. Juni 2008 um 10:43 Uhr, Abgelegt in Django & Python
Kommentare zu diesem Artikel (4):
-
Arthur schrieb am 17. Juni 2008:
Sehr guter Artikel — hatte sowas bisher immer "per hand" aufgebaut.
-
Jannis Leidel schrieb am 17. Juni 2008:
Super Artikel der mal wieder beweist: die einfachsten Lösungen sind immer die schönsten. Danke, Martin!
-
Marcel schrieb am 19. Juni 2008:
sehr guter Beitrag! war die erste seite die ich gefunden habe und hat mir auf anhieb weitergeholfen.
viele grüße
-
max lössberger schrieb am 05. Juli 2008:
wow..toller beitrag..endlich gibts auch mal wieder richtig gute artikel, mit denen man auch was anfangen kann
Kommentar schreiben