Forms

Ablauf

  1. Webbrowser sendet GET-Request: http://example.com/question/add/
  2. Webserver erhält Request, sendet ihn per WSGI an Django
  3. Dort per urls.py dann zu Python View Methode

Überblick

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.
  • Widget: Anzeige (Radiobuttons vs Select/DropDownBox)
  • Field: ‘2012-03-18’ –> datetime(2012, 3, 18)

Formular Objekte

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)

Anzeige in einem View

def contact(request):
    if request.method == 'POST': # Nutzer hat Submit gedrückt.
        form = ContactForm(request.POST) # Formular "bound"
        if form.is_valid(): # Data OK?
            form.save() # POST ändert Daten
            return HttpResponseRedirect('./') # Redirect after POST
    else:
        form = ContactForm() # Formular "unbound" (ohne Nutzerdaten)

    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), Formular bound, Daten OK, save, Redirect
  3. Falls POST (Formular wurde ausgefüllt), Formular bound, Daten falsch, Formular nochmal anzeigen.

Unterschied zwischen bound und unbound ist entscheidend!

Eingabewerte verarbeiten

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.

ModelForm

Aus dem DB-Model das Formular automatisch erzeugen:

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/

Noch mehr...

Previous topic

Next topic