Python網路編程08----Django表單,python08----django
一、從Request對象中擷取資料 我們在講述View的函數時已經介紹過HttpRequest對象了,但當時並沒有講太多。 讓我們回憶下:每個view函數的第一個參數是一個HttpRequest對象,就像下面這個hello()函數:
from django.http import HttpResponsedef hello(request): return HttpResponse("Hello world")
HttpRequest對象,比如上面代碼裡的request變數,會有一些有趣的、你必須讓自己熟悉的屬性和方法,以便知道能拿它們來做些什麼。 在view函數的執行過程中,你可以用這些屬性來擷取當前request的一些資訊(比如,你正在載入這個頁面的使用者是誰,或者用的是什麼瀏覽器)。
1. URL相關資訊
HttpRequest對象包含當前請求URL的一些資訊:
| 屬性/方法 |
說明 |
舉例 |
| request.path |
除網域名稱以外的請求路徑,以正斜杠開頭 |
"/hello/" |
| request.get_host() |
主機名稱(比如,通常所說的網域名稱) |
"127.0.0.1:8000" or "www.example.com" |
| request.get_full_path() |
請求路徑,可能包含查詢字串 |
"/hello/?print=true" |
| request.is_secure() |
如果通過HTTPS訪問,則此方法返回True, 否則返回False |
True 或者 False |
在view函數裡,如果想使用URL,請始終用這個屬性或方法來得到URL,而不要手動輸入。 這會使得代碼更加靈活,以便在其它地方重用。 下面是一個簡單的例子:
# BAD!def current_url_view_bad(request): return HttpResponse("Welcome to the page at /current/")# GOODdef current_url_view_good(request): return HttpResponse("Welcome to the page at %s" % request.path)
2. 提交的資料資訊
除了基本的中繼資料,HttpRequest對象還有兩個屬性包含了使用者所提交的資訊: request.GET 和 request.POST。二者都是類字典對象,你可以通過它們來訪問GET和POST資料。
1.類字典對象
我們說request.GET和request.POST是類字典對象,意思是他們的行為像Python裡標準的字典對象,但在技術底層上他們不是標準字典對象。 比如說,request.GET和request.POST都有get()、keys()和values()方法,你可以用用 for key in request.GET 擷取所有的鍵。
POST資料是來自HTML中的〈form〉標籤提交的,而GET資料可能來自〈form〉提交也可能是URL中的查詢字串(the query string)。
一個簡單的表單處理樣本 ,我們現在來建立一個簡單的view函數以便讓使用者可以通過書名從資料庫中尋找部落格。
(接著這個做吧,http://download.csdn.net/detail/a359680405/8401353)
通常,表單開發分為兩個部分: 前端HTML頁面使用者介面和後台view函數對所提交資料的處理過程。
第一部分很簡單,現在我們來建立個view來顯示一個搜尋表單:
from django.shortcuts import render_to_responsedef search_form(request): return render_to_response('search_form.html') 咱們將它放在 blog\views.py 裡。
search_form.html 模板
<html><head> <title>Search</title></head><body> <form action="/blog/search/" method="get"> <input type="text" name="q"> <input type="submit" value="Search"> </form></body></html>
而 blog\urls.py 中的 URLpattern 可能是這樣的:
from django.conf.urls import patterns, include, urlurlpatterns = patterns('', # ... url(r'^search-form/$', 'blog.views.search_form'), # ...) 現在,如果你運行 runserver 命令,然後訪問
http://127.0.0.1:8000/blog/search-form/,你會看到搜尋介面。 非常簡單。
不過,當你通過這個form提交資料時,你會得到一個Django 404錯誤。 這個Form指向的URL /search/ 還沒有被實現。 讓我們添加第二個視圖函數並設定URL:
blog\urls.py
urlpatterns = patterns('', # ... url(r'^search-form/$', 'blog.views.search_form'), url(r'^search/$', 'blog.views.search'), # ...)blog\views.py
def search(request): if 'q' in request.GET: message = 'You searched for: %r' % request.GET['q'] else: message = 'You submitted an empty form.' return HttpResponse(message)
在HTML裡我們定義了一個變數q。當提交表單時,變數q的值通過GET(method=”get”)附加在URL /search/上。處理/search/(search())的視圖通過request.GET來擷取q的值。
需要注意的是在這裡明確地判斷q是否包含在request.GET中。就像上面request.META小節裡面提到,對於使用者提交過來的資料,甚至是正確的資料,都需要進行過濾。在這裡若沒有進行檢測,那麼使用者提交一個空的表單將引發KeyError異常:
2.查詢字串參數
擷取使用POST方法的資料與GET的相似,只是使用request.POST代替了request.GET。那麼,POST與GET之間有什麼不同?當我們提交表單僅僅需要擷取資料時就可以用GET; 而當我們提交表單時需要更改伺服器資料的狀態,或者說發送e-mail,或者其他不僅僅是擷取並顯示資料的時候就使用POST。 在這個搜尋部落格的例子裡,我們使用GET,因為這個查詢不會更改伺服器資料的狀態。 (如果你有興趣瞭解