Seite 1 von 1

django form validierung

Verfasst: Donnerstag 8. März 2012, 00:43
von felix...
Hallo! Ich sitze gerade an einem kleinen Formular und aus irgendwelchen Gründen funktioniert die Validierung nicht. Vielleicht sieht ja jemand den Fehler und kann mir helfen. Es wäre traumhaft! :)

Hier das Formular:

Code: Alles auswählen

from django import forms

class contact(forms.Form):
	vorname = forms.CharField()
	nachname = forms.CharField()
	email = forms.EmailField()
	nachricht = forms.CharField(widget=forms.Textarea)
Hier die urls:

Code: Alles auswählen

from django.conf.urls.defaults import patterns, include, url
from form.views import form_view, thanks_view

urlpatterns = patterns('',
	url('^form/$', form_view),
	url('^thanks/$', thanks_view),
)
Hier die Viewfunction:

Code: Alles auswählen

from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.core.mail import send_mail
from form.forms import contact

def form_view(request):
	if request.method == 'POST':
		a = contact(request.POST)
		if a.is_valid():
			b = a.cleaned_data
			send_mail(
				b['vorname'],
				b['nachname'],
				b['email'],
				b['nachricht'],
				b.get('email', 'xyz@abc.de'),
				['xyz@abc.de'],
			)
		return HttpResponseRedirect('/thanks/')
	else:
		a = contact()
		return render_to_response('contact.html', {'a': a})

def thanks_view(request):
	return render_to_response('thanks.html')
Hier die contact.html:

Code: Alles auswählen

<html>
    <head>
        <title>Contact us</title>
    </head>
    <body>
        <h1>Contact us</h1>
            {% if a.errors %}
                <p style="color: red;">
                    Please correct the error{{ a.errors|pluralize }} below.
                </p>
            {% endif %}
        <form action="." method="post">
            <table>
                {{ a.as_table }}
            </table>
            <input type="submit" value="Submit">
        </form>
    </body>
</html>
Und hier die /thanks/:

Code: Alles auswählen

<html>
    <head>
        <title>Thank You!</title>
    </head>
    <body>
        <h1>Thank You!</h1>
    </body>
</html>

Ich verstehe nicht warum es nicht funktioniert! Man wird onsubmit immer direkt zur url /thanks/ weitergeleitet, ohne dass die Eingaben geprüft werden. Ich hab die Validierung in der shell probiert.. die funktioniert auf jeden fall. Was mache ich falsch ?! :|

Edit: Arbeite grad die dokumentation durch (http://www.djangobook.com/en/2.0/chapter07/)

Re: django form validierung

Verfasst: Donnerstag 8. März 2012, 08:33
von /me
felix... hat geschrieben:

Code: Alles auswählen

                [...]
		if a.is_valid():
			b = a.cleaned_data
			send_mail(
				b['vorname'],
				b['nachname'],
				b['email'],
				b['nachricht'],
				b.get('email', 'xyz@abc.de'),
				['xyz@abc.de'],
			)
		return HttpResponseRedirect('/thanks/')
Ich verstehe nicht warum es nicht funktioniert! Man wird onsubmit immer direkt zur url /thanks/ weitergeleitet, ohne dass die Eingaben geprüft werden.
Du rufst if a.is_valid() auf und machst den Redirect dann unabhängig davon was das Ergebnis ist.

Re: django form validierung

Verfasst: Donnerstag 8. März 2012, 13:46
von felix...
ok.. aber warum?

Code: Alles auswählen

if a.is_valid()
...
return HttpResponseRedirect('/thanks/')
Das bezieht sich doch aufeinander oder nicht ?!

Was muss ich tun damit der redirect nicht mehr unabhängig vom Ergebnis ist?

Re: django form validierung

Verfasst: Donnerstag 8. März 2012, 13:51
von deets
Es richtig einruecken?

Code: Alles auswählen

if False:
    pass
print "redirect"
gibt doch auch redirect aus, egal, ob die Bedingung True oder False ist...

Re: django form validierung

Verfasst: Donnerstag 8. März 2012, 14:08
von felix...
oh man. Ja es war nicht richtig eingerückt. Ich sitz hier stundenlang.. verrückt. :)

So funktioniert es auf jeden fall:

Code: Alles auswählen

from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.core.mail import send_mail
from form.forms import contact

def form_view(request):
	if request.method == 'POST':
		a = contact(request.POST)
		if a.is_valid():
			b = a.cleaned_data
			send_mail(
				b['vorname'],
				b['nachname'],
				b['email'],
				b['nachricht'],
				b.get('email', 'xyz@abc.de'),
				['xyz@abc.de'],
			)
			return HttpResponseRedirect('/thanks/')
	else:
		a = contact()
	return render_to_response('contact.html', {'a': a})

def thanks_view(request):
	return render_to_response('thanks.html')