Original: http://docs.djangoproject.com/en/dev/topics/forms/
Aufgaben:
- HTML-Eingabefelder automatisch erzeugen.
- Übergebene Daten (POST/GET) zu Python Datentypen wandeln
- Daten validieren.
- Erneutes Anzeigen, falls Fehler in den Daten.
Die Formularbibliothek kann auch ohne Datenbankanbindung verwendet werden.
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': # 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:
- Beim ersten Aufruf des Formulars (GET), ist das Formular unbound.
- Falls POST (Formular wurde ausgefüllt), dann ist das Formular bound.
- Im Fehlerfall (is_valid() ist False), werden die eingegebenen Daten erneut angezeigt.
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.
Beispiel:
<form action="/contact/" method="POST">
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
...
...
...
{% 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>
...
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/
- 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/