django表單

1、主要內容css

  一、服務端獲取HttpRequest信息
        1)url相關信息
        2)HttpRequest.META中包含的鍵值對
        3)HttpRequest中用戶提交的信息
        4)HttpRequest.GET:來自於<form>標籤提交,或url查詢字符串
                  通常只是從服務端獲取信息
             HttpRequest.POST:來自於<form>標籤提交
                  可能修改服務端信息
        5)action=「「意味着表單將提交給與當前頁面相同的URL
    二、多參數校驗
        1)發郵件
        2)重定向:咱們應每次都給成功的POST請求作重定向。 這就是web開發的最佳實踐。
              緣由:post成功後,直接重定向,不會形成重複向同一個頁面post數據(返回同一個頁面時,但參數要求不一樣)。    
        3)forms類只有綁定了纔有error信息:
            initial函數不綁定,構造函數傳入數據才綁定
        4)forms類中使用"clean_字段名()"方法,自定義數據校驗規則
        5)forms類結合css進行渲染html

2、基礎代碼web

  一、主要結構django

  

  二、urls.pyapp

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

  三、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')

  四、forms.pypost

#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

  五、thanks.html測試

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <h2>Thanks for contact!!</h2>
</body>
</html>

3、兩種不一樣的頁面顯示ui

  一、forms.py中默認的方式(簡單測試)url

     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

  二、頁面中自定義顯示方式(詳細測試)

    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格式不正確,頁面會直接彈出提示,而不會提交到後臺

    

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

相關文章
相關標籤/搜索