django表单
一、主要内容
1、服务端获取HttpRequest信息
1)url相关信息
2)HttpRequest.META中包含的键值对
3)HttpRequest中用户提交的信息
4)HttpRequest.GET:来自于<form>标签提交,或url查询字符串
一般只是从服务端获取信息
HttpRequest.POST:来自于<form>标签提交
可能修改服务端信息
5)action=““意味着表单将提交给与当前页面相同的URL
2、多参数校验
1)发邮件
2)重定向:我们应每次都给成功的POST请求做重定向。 这就是web开发的最佳实践。
原因:post成功后,直接重定向,不会造成重复向同一个页面post数据(返回同一个页面时,但参数要求不同)。
3)forms类只有绑定了才有error信息:
initial函数不绑定,构造函数传入数据才绑定
4)forms类中使用"clean_字段名()"方法,自定义数据校验规则
5)forms类结合css进行渲染
二、基础代码
1、主要结构
2、urls.py
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', (r'^contact_author/$', 'django_manage_app.views.contact_author'), (r'^thanks/$', 'django_manage_app.views.thanks'), )
3、views.py
#coding:utf8 from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from django_manage_app.forms import ContactForm def contact_author(request): if request.method == 'POST':#提交请求时才会访问这一段,首次访问页面时不会执行 form = ContactForm(request.POST) if form.is_valid():#说明各个字段的输入值都符合要求 cd = form.cleaned_data#只有各个字段都符合要求时才有对应的cleaned_data print form.clean_message() print cd['subject'] print cd['email'] print cd['message'] return HttpResponseRedirect('/thanks/') else:#有部分字段不符合要求,会有error相关信息给加到form中去,需要覆盖掉 print form print '数据不符合要求' print form['subject'].errors print form['email'].errors print form['message'].errors else:#首次访问该url时没有post任何表单 form = ContactForm()#第一次生成的form里面内容的格式 print form print form.is_valid() #“首次访问”和“提交的信息不符合要求”时被调用 return render_to_response('contact_author.html', {'form': form}) def thanks(request): return render_to_response('thanks.html')
4、forms.py
#coding:utf8 from django import forms class ContactForm(forms.Form): subject = forms.CharField(max_length=10,label='主题')#设置最大长度为10 email = forms.EmailField(required=False,label='Email')#非必要字段 message = forms.CharField(widget=forms.Textarea,label='信息')#指定form中组件的类型 #自定义校验规则,该方法在校验时被系统自动调用,次序在“字段约束”之后 def clean_message(self): message = self.cleaned_data['message']#能到此处说明数据符合“字段约束”要求 num_words = len(message.split()) if num_words < 4: raise forms.ValidationError("单词个数低于4个!") return message
5、thanks.html
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h2>Thanks for contact!!</h2> </body> </html>
三、两种不同的页面显示
1、forms.py中默认的方式(简单测试)
1)contact_author.html:
<html> <style type="text/css"> {# <ul class="errorlist">。。。</ul> #} {# ul标签下的class="errorlist"的属性进行渲染 #}{# 标签下的属性 #} ul.errorlist { margin: 0; padding: 0; } {# <ul class="errorlist"><li>单词个数低于4个!</li></ul> #} {# errorlist class下的 li标签内的元素进行渲染 #}{# 属性下一级的标签 #} .errorlist li { background-color: red; color: white; display: block; font-size: 10px; margin: 0 0 3px; padding: 4px 5px; } .field{ background-color: gray; } </style> <head> <title>Contact us</title> </head> <body> {% if form.errors %} <p style="color: red;"> Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %} <form action="" method="post"> <table> {{ form.as_table }} </table> <input type="submit" value="提交"> </form> </body> </html>
2)测试
初次访问:
打印结果:
<tr><th><label for="id_subject">主题:</label></th><td><input id="id_subject" maxlength="10" name="subject" type="text" /></td></tr> <tr><th><label for="id_email">Email:</label></th><td><input id="id_email" name="email" type="email" /></td></tr> <tr><th><label for="id_message">信息:</label></th><td><textarea cols="40" id="id_message" name="message" rows="10"> </textarea></td></tr> False
2、页面中自定义显示方式(详细测试)
1)contact_author.html
<html> <style type="text/css"> {# <ul class="errorlist">。。。</ul> #} {# ul标签下的class="errorlist"的属性进行渲染 #}{# 标签下的属性 #} ul.errorlist { margin: 0; padding: 0; } {# <ul class="errorlist"><li>单词个数低于4个!</li></ul> #} {# errorlist class下的 li标签内的元素进行渲染 #}{# 属性下一级的标签 #} .errorlist li { background-color: red; color: white; display: block; font-size: 10px; margin: 0 0 3px; padding: 4px 5px; } .field{ background-color: gray; } </style> <head> <title>Contact us</title> </head> <body> {% if form.errors %} <p style="color: red;"> Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %} <form action="" method="post"> <div class="field"> {# 自动生成的默认错误信息显示 #} {# 会被翻译成:<ul class="errorlist"><li>这个字段是必填项。</li></ul> #} {{ form.subject.errors }} <label for="id_subject">页面自定义的主题:</label> {{ form.subject }} {# 自定义的错误信息显示 #} {% if form.subject.errors%} <label for="id_self_def_error_info" style="color: red;"> *自定义错误信息:主题不能为空 </label> {% endif %} </div> <div class="field"> {{ form.email.errors }} <label for="id_email">页面中自定义的email:</label> {{ form.email }} </div> <div class="field"> {{ form.message.errors }} <label for="id_message">页面中自定义的信息:</label> {{ form.message }} </div> <input type="submit" value="提交"> </form> </body> </html>
2)测试
a)首次访问
打印结果:
<tr><th><label for="id_subject">主题:</label></th><td><input id="id_subject" maxlength="10" name="subject" type="text" /></td></tr> <tr><th><label for="id_email">Email:</label></th><td><input id="id_email" name="email" type="email" /></td></tr> <tr><th><label for="id_message">信息:</label></th><td><textarea cols="40" id="id_message" name="message" rows="10"> </textarea></td></tr> False
b)输入正确格式并提交
打印结果:
c)输入错误格式并提交
打印结果: 最终页面显示时,form类中定义的label文字,被自定义的内容替换
<tr><th><label for="id_subject">主题:</label></th><td><ul class="errorlist"><li>这个字段是必填项。</li></ul><input id="id_subject" maxlength="10" name="subject" type="text" /></td></tr> <tr><th><label for="id_email">Email:</label></th><td><input id="id_email" name="email" type="email" value="aaa@sina.com" /></td></tr> <tr><th><label for="id_message">信息:</label></th><td><ul class="errorlist"><li>单词个数低于4个!</li></ul><textarea cols="40" id="id_message" name="message" rows="10"> s</textarea></td></tr> 数据不符合要求 <ul class="errorlist"><li>这个字段是必填项。</li></ul> <ul class="errorlist"><li>单词个数低于4个!</li></ul>
ps: 如果email格式不正确,页面会直接弹出提示,而不会提交到后台