Django之表單


  

Request對象

每個view函數的第一個參數是一個HttpRequest對象,就像下面這個hello()函數:

from django.http import HttpResponse

def hello(request):

returnHttpResponse("Hello world")

 

HttpRequest對象,比如上面代碼裏的request變量,有衆多的屬性與方法:

wKioL1ds82jSna99AACXjFbP8Yk782.jpg

例:

def current_url_view_good(request):

   return HttpResponse("Welcome to the page at %s" % request.path)

 

 

request.META

request.META 是一個Python字典,包含了所有本次HTTP請求的Header信息

常見的鍵值有:

  • HTTP_REFERER,進站前鏈接網頁,如果有的話。(請注意,它是REFERRER的筆誤。)

  • HTTP_USER_AGENT,用戶瀏覽器的user-agent字符串,如果有的話。例如:

  • "Mozilla/5.0 (X11; U; Linux i686; frFR;rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .

  • REMOTE_ADDR 客戶端IP,如:"12.345.67.89" (如果申請是經過代理服務器的話,那麼它可能是以逗號分割的多個IP地址,如:"12.345.67.89,23.456.78.90" )

 

注意,因爲 request.META 是一個普通的Python字典,因此當你試圖訪問一個不存在的鍵時,會觸發一個KeyError異常。應該用try/except 語句,或者用Python字典的 get() 方法來處理這些“可能不存在的鍵”:

例:

def ua_display_good1(request):

try:

   ua = request.META['HTTP_USER_AGENT']

except KeyError:

   ua = 'unknown'

   return HttpResponse("Your browser is %s" % ua)

def ua_display_good2(request):

   ua = request.META.get('HTTP_USER_AGENT','unknown')

   return HttpResponse("Your browser is %s" % ua)

 

 

提交的數據信息

除了基本的元數據,HttpRequest對象還有兩個屬性包含了用戶所提交的信息:request.GETrequest.POST。二者都是類字典對象,你可以通過它們來訪問GETPOST數據。

 

  • 兩者區別:

POST數據是來自HTML中的〈form〉標籤提交的,而GET數據可能來自〈form〉提交也可能是URL中的查詢字符串(the query string)

 

  • 表單常見的應用方法:

urls.py中設定訪問路徑,關聯到views.py中的函數,views.py中的函數返回一個表單錄入頁面,該表單頁面錄入提交後會有一個url,urls.py中設置一個正則去匹配這個url,匹配到後又調用vews.py中設定的函數獲取表單中的各個內容進行處理。

 

 

表單form

1、基本使用方法

A.       一般會建一個forms.py文件到對應應用的目錄,即和views.py同一目錄

forms.py內容:

from django import forms

class ContactForm(forms.Form):

subject = forms.CharField()

email = forms.EmailField(required=False)

message = forms.CharField()

 

B.       views.py中就可以調用這個類來用了

例:

from django.shortcuts import render,render_to_response

from django.http import HttpResponse

from polls.models import Question

from django.core.mail import send_mail

from django.http import HttpResponseRedirect

from django.views.decorators.csrf import csrf_exempt

frompolls.forms import ContactForm  #導入forms.py中的表單類ContactForm,用到哪個表單類就引入哪個

 

@csrf_exempt

def contact(request):

errors = []

if request.method == 'POST':

form = ContactForm(request.POST)

if form.is_valid():

cd = form.cleaned_data

send_mail(

  1. cd['subject'],

  2. cd['message'],

  3. cd.get('email','[email protected]'),

  4. ['[email protected]'],)

return HttpResponseRedirect('polls/contact/thanks/')

else:

form = ContactForm()

returnrender_to_response('polls/contact_form.html',{'form': form})

 

C.        在相應的contact_form.html上這樣調用

例:

<html>

<head>

<title>Contact us</title>

</head>

<body>

<h1>Contact us</h1>

{%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="Submit">

</form>

</body>

</html>

 

2form類中一些常用方法和屬性

A.       is_valid()

調用任何綁定formis_valid()方法,就可以知道它的數據是否合.

例:

form.is_valid()

返回True表示沒有錯誤,返回Flase表示某些字段有錯誤

 

 

B.       errors

每一個邦定Form實體都有一個errors屬性,它爲你提供了一個字段與錯誤消息相映射的字典表. 你可以逐一查看每個字段的出錯消息

例:

>>> f = ContactForm({'subject': 'Hello', 'message':''})

>>> f['message'].errors

[u'This field is required.']

>>> f['subject'].errors

[]

>>> f['email'].errors

[]

 

C.        cleaned_data屬性

如果一個Form實體的數據是合法的,它就會有一個可用的cleaned_data屬性。相當於轉換成字典了。 Djangoform框架不但校驗數據,它還會把它們轉換成相應的Python類型數據,這叫做清理數

據。

例:

>>> f = ContactForm({subject': Hello, email:[email protected], message: Nice site!})

>>> f.is_valid()

True

>>> f.cleaned_data

{message': uNice site!, email: [email protected],subject: uHello}

>>>cd = f.cleaned_data

>>>print cd

{message': uNice site!, email: [email protected],subject: uHello}

 

 

3、改變字段顯示

當你在本地顯示這個表單的時,某些字段被顯示成`` input type=text`` ,例如message字段,它應該

被顯示成<`` textarea`` >。我們可以通過設置 widget 來修改它:

from django import forms

class ContactForm(forms.Form):

subject = forms.CharField()

email = forms.EmailField(required=False)

message = forms.CharField(widget=forms.Textarea )

forms框架把每一個字段的顯示邏輯分離到一組部件(widget)中。 每一個字段類型都擁有一個默認的部件,

我們也可以容易地替換掉默認的部件,或者提供一個自定義的部件

 

 

4、設置最大長度

一個最經常使用的校驗要求是檢查字段長度。例如使subject限制在100個字符以內。爲此,僅需爲CharField提供max_length參數,像這樣:

from django import forms

class ContactForm(forms.Form):

subject = forms.CharField(max_length=100 )

email = forms.EmailField(required=False)

message = forms.CharField(widget=forms.Textarea)

選項min_length參數同樣可用。

 

 

5、設置初始值

可以在創建Form實體時,使用initial參數:

def contact(request):

if request.method == 'POST':

form = ContactForm(request.POST)

if form.is_valid():

cd = form.cleaned_data

send_mail(

cd['subject'],

cd['message'],

cd.get('email', `'[email protected]`_'),

[`'[email protected]`_'],

)

return HttpResponseRedirect('/contact/thanks/')

else:

form = ContactForm(initial={'subject': 'I loveyour site!'})

return render_to_response('contact_form.html', {'form': form})

 

6、自定義校驗規則

例如希望`` message`` 字段有一個額外的校驗,我們增加一個`` clean_message()`` 方法到`` Form`` 類:

from django import forms

class ContactForm(forms.Form):

subject = forms.CharField(max_length=100)

email = forms.EmailField(required=False)

message = forms.CharField(widget=forms.Textarea)

def clean_message(self):

message = self.cleaned_data['message']

num_words = len(message.split())

if num_words < 4:

raise forms.ValidationError("Not enough words!")

return message

Djangoform系統自動尋找匹配的函數方法,該方法名稱以clean_開頭,並以字段名稱結束。如果有這樣的方法,它將在校驗時被調用。

clean_message()方法將在指定字段的默認校驗邏輯執行之後被調用。(本例中,在必填CharField這個校驗邏輯之後。)因爲字段數據已經被部分處理,所以它被從self.cleaned_data中提取出來

了。我們不必擔心數據是否爲空,因爲它已經被校驗過了。

我們簡單地使用了len()split()的組合來計算單詞的數量。如果用戶輸入字數不足,我們拋出一個forms.ValidationError型異常。這個異常的描述會被作爲錯誤列表中的一項顯示給用戶。

在函數的末尾顯式地返回字段的值非常重要。我們可以在我們自定義的校驗方法中修改它的值(或者把它轉換成另一種Python類型)。如果我們忘記了這一步,None值就會返回,原始的數據就丟失掉了。

 

 

7、指定標籤

HTML表單中自動生成的標籤默認是按照規則生成的:用空格代替下劃線,首字母大寫。如email的標籤是"Email"。可以使用label自定義

class ContactForm(forms.Form):

subject = forms.CharField(max_length=100)

email = forms.EmailField(required=False, label='Youre-mail address' )

message = forms.CharField(widget=forms.Textarea)

 

 

技巧

 

A.       view.py中變量提交的懶人方法,使用locals()提交所有局部變量

例:

def showrequest(request):

values = request.META.items()

values.sort()

a1 = ‘hello’

b1 = ‘ni hao ‘

return render(request,'polls/showrequest.html',locals())

a1b1values都傳遞到showrequest.html去了

 

B.       模板文件中可以直接輸出request.META相關的值

例:

showrequest.html文件的內容

<html>

<body>

<table>

`request`.`path`

</table>

</body>

</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章