Request對象
每個view函數的第一個參數是一個HttpRequest對象,就像下面這個hello()函數:
from django.http import HttpResponse
def hello(request):
returnHttpResponse("Hello world")
HttpRequest對象,比如上面代碼裏的request變量,有衆多的屬性與方法:
例:
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; fr‐FR;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.GET和request.POST。二者都是類字典對象,你可以通過它們來訪問GET和POST數據。
兩者區別:
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(
cd['subject'],
cd['message'],
cd.get('email','[email protected]'),
['[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>
2、form類中一些常用方法和屬性
A. is_valid()
調用任何綁定form的is_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屬性。相當於轉換成字典了。 Django的form框架不但校驗數據,它還會把它們轉換成相應的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
Django的form系統自動尋找匹配的函數方法,該方法名稱以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())
a1、b1、values都傳遞到showrequest.html去了
B. 模板文件中可以直接輸出request.META相關的值
例:
showrequest.html文件的內容
<html>
<body>
<table>
`request`.`path`
</table>
</body>
</html>