在Django中創(chuàng)建URLconf相關(guān)的通用視圖的方法
抽取出我們代碼中共性的東西是一個(gè)很好的編程習(xí)慣。 比如,像以下的兩個(gè)Python函數(shù):
def say_hello(person_name): print 'Hello, %s' % person_name def say_goodbye(person_name): print 'Goodbye, %s' % person_name
我們可以把問候語提取出來變成一個(gè)參數(shù):
def greet(person_name, greeting): print '%s, %s' % (greeting, person_name)
通過使用額外的URLconf參數(shù),你可以把同樣的思想應(yīng)用到Django的視圖中。
了解這個(gè)以后,你可以開始創(chuàng)作高抽象的視圖。 更具體地說,比如這個(gè)視圖顯示一系列的 Event 對(duì)象,那個(gè)視圖顯示一系列的 BlogEntry 對(duì)象,并意識(shí)到它們都是一個(gè)用來顯示一系列對(duì)象的視圖的特例,而對(duì)象的類型其實(shí)就是一個(gè)變量。
以這段代碼作為例子:
# urls.py
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^events/$', views.event_list),
(r'^blog/entries/$', views.entry_list),
)
# views.py
from django.shortcuts import render_to_response
from mysite.models import Event, BlogEntry
def event_list(request):
obj_list = Event.objects.all()
return render_to_response('mysite/event_list.html', {'event_list': obj_list})
def entry_list(request):
obj_list = BlogEntry.objects.all()
return render_to_response('mysite/blogentry_list.html', {'entry_list': obj_list})
這兩個(gè)視圖做的事情實(shí)質(zhì)上是一樣的: 顯示一系列的對(duì)象。 讓我們把它們顯示的對(duì)象的類型抽象出來:
# urls.py
from django.conf.urls.defaults import *
from mysite import models, views
urlpatterns = patterns('',
(r'^events/$', views.object_list, {'model': models.Event}),
(r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),
)
# views.py
from django.shortcuts import render_to_response
def object_list(request, model):
obj_list = model.objects.all()
template_name = 'mysite/%s_list.html' % model.__name__.lower()
return render_to_response(template_name, {'object_list': obj_list})
就這樣小小的改動(dòng),我們突然發(fā)現(xiàn)我們有了一個(gè)可復(fù)用的,模型無關(guān)的視圖! 從現(xiàn)在開始,當(dāng)我們需要一個(gè)視圖來顯示一系列的對(duì)象時(shí),我們可以簡(jiǎn)簡(jiǎn)單單的重用這一個(gè) object_list 視圖,而無須另外寫視圖代碼了。 以下是我們做過的事情:
我們通過 model 參數(shù)直接傳遞了模型類。 額外URLconf參數(shù)的字典是可以傳遞任何類型的對(duì)象,而不僅僅只是字符串。
這一行: model.objects.all() 是 鴨子界定 (原文:
我們使用 model.__name__.lower() 來決定模板的名字。 每個(gè)Python的類都有一個(gè) __name__ 屬性返回類名。 這特性在當(dāng)我們直到運(yùn)行時(shí)刻才知道對(duì)象類型的這種情況下很有用。 比如, BlogEntry 類的 __name__ 就是字符串 'BlogEntry' 。
這個(gè)例子與前面的例子稍有不同,我們傳遞了一個(gè)通用的變量名給模板。 當(dāng)然我們可以輕易的把這個(gè)變量名改成 blogentry_list 或者 event_list ,不過我們打算把這當(dāng)作練習(xí)留給讀者。
因?yàn)閿?shù)據(jù)庫驅(qū)動(dòng)的網(wǎng)站都有一些通用的模式,Django提供了一個(gè)通用視圖的集合,使用它可以節(jié)省你的時(shí)間。 我們將會(huì)在下一章講講Django的內(nèi)置通用視圖。
提供視圖配置選項(xiàng)
如果你發(fā)布一個(gè)Django的應(yīng)用,你的用戶可能會(huì)希望配置上能有些自由度。 這種情況下,為你認(rèn)為用戶可能希望改變的配置選項(xiàng)添加一些鉤子到你的視圖中會(huì)是一個(gè)很好的主意。 你可以用額外URLconf參數(shù)實(shí)現(xiàn)。
一個(gè)應(yīng)用中比較常見的可供配置代碼是模板名字:
def my_view(request, template_name):
var = do_something()
return render_to_response(template_name, {'var': var})
了解捕捉值和額外參數(shù)之間的優(yōu)先級(jí) 額外的選項(xiàng)
當(dāng)沖突出現(xiàn)的時(shí)候,額外URLconf參數(shù)優(yōu)先于捕捉值。 也就是說,如果URLconf捕捉到的一個(gè)命名組變量和一個(gè)額外URLconf參數(shù)包含的變量同名時(shí),額外URLconf參數(shù)的值會(huì)被使用。
例如,下面這個(gè)URLconf:
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^mydata/(?P<id>\d+)/$', views.my_view, {'id': 3}),
)
這里,正則表達(dá)式和額外字典都包含了一個(gè) id 。硬編碼的(額外字典的) id 將優(yōu)先使用。 就是說任何請(qǐng)求(比如, /mydata/2/ 或者 /mydata/432432/ )都會(huì)作 id 設(shè)置為 3 對(duì)待,不管URL里面能捕捉到什么樣的值。
聰明的讀者會(huì)發(fā)現(xiàn)在這種情況下,在正則表達(dá)式里面寫上捕捉是浪費(fèi)時(shí)間的,因?yàn)?id 的值總是會(huì)被字典中的值覆蓋。 沒錯(cuò),我們說這個(gè)的目的只是為了讓你不要犯這樣的錯(cuò)誤。
相關(guān)文章
Python爬蟲解析網(wǎng)頁的4種方式實(shí)例及原理解析
這篇文章主要介紹了Python爬蟲解析網(wǎng)頁的4種方式實(shí)例及原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
python+OpenCV實(shí)現(xiàn)圖像拼接
這篇文章主要為大家詳細(xì)介紹了python+OpenCV實(shí)現(xiàn)圖像拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
使用Python Flask構(gòu)建輕量級(jí)靈活的Web應(yīng)用實(shí)例探究
Flask是一個(gè)流行的Python Web框架,以其輕量級(jí)、靈活和易學(xué)的特性受到開發(fā)者的喜愛,本文將深入探討Flask框架的各個(gè)方面,通過詳實(shí)的示例代碼,幫助大家更全面地了解和掌握這一強(qiáng)大的工具,2024-01-01
python實(shí)現(xiàn)月食效果實(shí)例代碼
在本文里小編給大家整理了關(guān)于python實(shí)現(xiàn)月食效果的相關(guān)實(shí)例內(nèi)容以及對(duì)應(yīng)代碼,有興趣的朋友們學(xué)習(xí)下。2019-06-06
nx.adjacency_matrix計(jì)算鄰接矩陣與真實(shí)結(jié)果不一致的解決
這篇文章主要介紹了nx.adjacency_matrix計(jì)算鄰接矩陣與真實(shí)結(jié)果不一致的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python標(biāo)準(zhǔn)庫學(xué)習(xí)之operator.itemgetter函數(shù)的使用
operator.itemgetter是Python標(biāo)準(zhǔn)庫operator模塊中的一個(gè)函數(shù),本文主要介紹了Python標(biāo)準(zhǔn)庫學(xué)習(xí)之operator.itemgetter函數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
Anaconda虛擬環(huán)境配置Python庫與Spyder編譯器的方法
在文章創(chuàng)建Anaconda虛擬Python環(huán)境的方法中,我們介紹了在Anaconda環(huán)境下,創(chuàng)建、使用與刪除Python虛擬環(huán)境的方法,而創(chuàng)建虛擬環(huán)境后,就需要在對(duì)應(yīng)的環(huán)境內(nèi)配置各類庫與軟件,本文就對(duì)這些操作加以介紹,感興趣的朋友感興趣的朋友一起看看吧2024-04-04
python爬蟲設(shè)置每個(gè)代理ip的簡(jiǎn)單方法
在本篇文章里小編給大家整理了一篇關(guān)于python爬蟲設(shè)置每個(gè)代理ip的簡(jiǎn)單方法,有興趣的朋友們可以學(xué)習(xí)參考下。2021-08-08
詳解如何使用python創(chuàng)建和結(jié)束線程
線程的創(chuàng)建和結(jié)束是多線程編程中的核心概念之一,在本文中,我們將學(xué)習(xí)如何使用 Python 創(chuàng)建線程,并探討如何優(yōu)雅地結(jié)束線程,需要的朋友可以參考下2024-04-04
實(shí)例解析Python的Twisted框架中Deferred對(duì)象的用法
Deferred對(duì)象在Twsited框架中用于處理回調(diào),這對(duì)于依靠異步的Twisted來說十分重要,接下來我們就以實(shí)例解析Python的Twisted框架中Deferred對(duì)象的用法2016-05-05

