django form validierung

Django, Flask, Bottle, WSGI, CGI…
Antworten
felix...
User
Beiträge: 3
Registriert: Donnerstag 1. März 2012, 13:06

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/)
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
felix...
User
Beiträge: 3
Registriert: Donnerstag 1. März 2012, 13:06

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?
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...
felix...
User
Beiträge: 3
Registriert: Donnerstag 1. März 2012, 13:06

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')
Antworten