django表单


一、主要内容

  1、服务端获取HttpRequest信息
        1)url相关信息
        2)HttpRequest.META中包含的键值对
        3)HttpRequest中用户提交的信息
        4)HttpRequest.GET:来自于

标签提交,或url查询字符串
                  一般只是从服务端获取信息
             HttpRequest.POST:来自于标签提交
                  可能修改服务端信息
        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:




    Contact us


    {% if form.errors %}
        

"color: red;"> Please correct the error{{ form.errors|pluralize }} below.

{% endif %} "" method="post"> {{ form.as_table }}
"submit" value="提交">

   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




    Contact us


    {% if form.errors %}
        

"color: red;"> Please correct the error{{ form.errors|pluralize }} below.

{% endif %}
"" method="post">
class="field"> {# 自动生成的默认错误信息显示 #} {# 会被翻译成:
  • 这个字段是必填项。
#}
{{ form.subject.errors }} {{ form.subject }} {# 自定义的错误信息显示 #} {% if form.subject.errors%} {% endif %}
class="field"> {{ form.email.errors }} {{ form.email }}
class="field"> {{ form.message.errors }} {{ form.message }}
"submit" value="提交">

   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">
stextarea>td>tr>
数据不符合要求
<ul class="errorlist"><li>这个字段是必填项。li>ul>

<ul class="errorlist"><li>单词个数低于4个!li>ul>

     ps: 如果email格式不正确,页面会直接弹出提示,而不会提交到后台

    

参考:http://djangobook.py3k.cn/2.0/chapter07/