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.

<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


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. :-)


↑ to the elevators

© 2001—2010 Martin Mahner. This is an I ♥ Django Project.

Admin | Generated: Wed, 1 Sep 2010 00:04:01 +0200