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="[email protected]" /></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格式不正确,页面会直接弹出提示,而不会提交到后台

    

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

你可能感兴趣的:(django)