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