Working with forms

Original: http://docs.djangoproject.com/en/dev/topics/forms/

Aufgaben:

  1. HTML-Eingabefelder automatisch erzeugen.
  2. Übergebene Daten (POST/GET) zu Python Datentypen wandeln
  3. Daten validieren.
  4. Erneutes Anzeigen, falls Fehler in den Daten.

Overview

Widget
HTML Eingabefeld: <input type="text">, <input type="hidden">, <select> oder <textarea> ...
Field
DateField, IntegerField, ...
Form
Eine Gruppe von Feldern.
Form Media
CSS und JavaScript

Die Formularbibliothek kann auch ohne Datenbankanbindung verwendet werden.

Form objects

Kontakt Formular

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)

Using a form in a view

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })

Drei mögliche Abläufe:

  1. Beim ersten Aufruf des Formulars (GET), ist das Formular unbound.
  2. Falls POST (Formular wurde ausgefüllt), dann ist das Formular bound.
  3. Im Fehlerfall (is_valid() ist False), werden die eingegebenen Daten erneut angezeigt.

Unterschied zwischen bound und unbound ist entscheidend!

Processing the data from a form

form.cleaned_data enthält im Gegensatz zu request.POST die konvertierten Daten (z.B. datetime Objekt anstatt Zeichenkette “31.12.2008”)

“Redirect after POST” ist auch sinnvoll, falls das gleiche Formular erneut angezeigt werden soll.

Displaying a form using a template

Beispiel:

<form action="/contact/" method="POST">
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

...

Customizing the form template

...

Looping over the form’s fields

...

{% for %} Schleife:

<form action="/contact/" method="POST">
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        </div>
    {% endfor %}
    <p><input type="submit" value="Send message" /></p>
</form>

Reusable form templates

...

ModelForm

ANDERS:

from django import forms

class PollForm(forms.ModelForm):
    class Meta:
        model = Poll

def edit(request, poll_id):
    if request.method=='POST':
        data=request.POST
    else data=None

    poll=Poll.objects.get(id=poll_id)
    form=PollForm(data, instance=poll)

    if form.is_valid() and form.changed_data:
        form.save()

Mehr zu ModelForm: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Further topics