- Webbrowser sendet GET-Request: http://example.com/question/add/
- Webserver erhält Request, sendet ihn per WSGI an Django
- Dort per urls.py dann zu Python View Methode
<input type="text">
, <input type="hidden">
, <select>
oder <textarea>
...DateField
, IntegerField
, ...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)
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:
- Beim ersten Aufruf des Formulars (GET), ist das Formular
unbound
.- Falls POST (Formular wurde ausgefüllt), Formular
bound
, Daten OK, save, Redirect- Falls POST (Formular wurde ausgefüllt), Formular
bound
, Daten falsch, Formular nochmal anzeigen.
Unterschied zwischen bound und unbound ist entscheidend!
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.
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/
- Formular Vererbung
- In einem <form> Tag können mehrere Instanzen einer Form-Klasse per
prefix
eingebunden werden (Beispiel: Anmeldeformular für Team mit 5 Mitgliedern) http://docs.djangoproject.com/en/dev/ref/forms/api/#prefixes-for-forms- Validierung: http://docs.djangoproject.com/en/dev/ref/forms/validation/