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

    

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM