在Django中創(chuàng)建URLconf相關(guān)的通用視圖的方法
抽取出我們代碼中共性的東西是一個很好的編程習(xí)慣。 比如,像以下的兩個Python函數(shù):
def say_hello(person_name): print 'Hello, %s' % person_name def say_goodbye(person_name): print 'Goodbye, %s' % person_name
我們可以把問候語提取出來變成一個參數(shù):
def greet(person_name, greeting): print '%s, %s' % (greeting, person_name)
通過使用額外的URLconf參數(shù),你可以把同樣的思想應(yīng)用到Django的視圖中。
了解這個以后,你可以開始創(chuàng)作高抽象的視圖。 更具體地說,比如這個視圖顯示一系列的 Event 對象,那個視圖顯示一系列的 BlogEntry 對象,并意識到它們都是一個用來顯示一系列對象的視圖的特例,而對象的類型其實就是一個變量。
以這段代碼作為例子:
# 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})
這兩個視圖做的事情實質(zhì)上是一樣的: 顯示一系列的對象。 讓我們把它們顯示的對象的類型抽象出來:
# 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})
就這樣小小的改動,我們突然發(fā)現(xiàn)我們有了一個可復(fù)用的,模型無關(guān)的視圖! 從現(xiàn)在開始,當我們需要一個視圖來顯示一系列的對象時,我們可以簡簡單單的重用這一個 object_list 視圖,而無須另外寫視圖代碼了。 以下是我們做過的事情:
我們通過 model 參數(shù)直接傳遞了模型類。 額外URLconf參數(shù)的字典是可以傳遞任何類型的對象,而不僅僅只是字符串。
這一行: model.objects.all() 是 鴨子界定 (原文:
我們使用 model.__name__.lower() 來決定模板的名字。 每個Python的類都有一個 __name__ 屬性返回類名。 這特性在當我們直到運行時刻才知道對象類型的這種情況下很有用。 比如, BlogEntry 類的 __name__ 就是字符串 'BlogEntry' 。
這個例子與前面的例子稍有不同,我們傳遞了一個通用的變量名給模板。 當然我們可以輕易的把這個變量名改成 blogentry_list 或者 event_list ,不過我們打算把這當作練習(xí)留給讀者。
因為數(shù)據(jù)庫驅(qū)動的網(wǎng)站都有一些通用的模式,Django提供了一個通用視圖的集合,使用它可以節(jié)省你的時間。 我們將會在下一章講講Django的內(nèi)置通用視圖。
提供視圖配置選項
如果你發(fā)布一個Django的應(yīng)用,你的用戶可能會希望配置上能有些自由度。 這種情況下,為你認為用戶可能希望改變的配置選項添加一些鉤子到你的視圖中會是一個很好的主意。 你可以用額外URLconf參數(shù)實現(xiàn)。
一個應(yīng)用中比較常見的可供配置代碼是模板名字:
def my_view(request, template_name):
var = do_something()
return render_to_response(template_name, {'var': var})
了解捕捉值和額外參數(shù)之間的優(yōu)先級 額外的選項
當沖突出現(xiàn)的時候,額外URLconf參數(shù)優(yōu)先于捕捉值。 也就是說,如果URLconf捕捉到的一個命名組變量和一個額外URLconf參數(shù)包含的變量同名時,額外URLconf參數(shù)的值會被使用。
例如,下面這個URLconf:
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^mydata/(?P<id>\d+)/$', views.my_view, {'id': 3}),
)
這里,正則表達式和額外字典都包含了一個 id 。硬編碼的(額外字典的) id 將優(yōu)先使用。 就是說任何請求(比如, /mydata/2/ 或者 /mydata/432432/ )都會作 id 設(shè)置為 3 對待,不管URL里面能捕捉到什么樣的值。
聰明的讀者會發(fā)現(xiàn)在這種情況下,在正則表達式里面寫上捕捉是浪費時間的,因為 id 的值總是會被字典中的值覆蓋。 沒錯,我們說這個的目的只是為了讓你不要犯這樣的錯誤。
相關(guān)文章
利用Python3分析sitemap.xml并抓取導(dǎo)出全站鏈接詳解
因為最近更換了網(wǎng)址,所以需要在百度站長平臺提交網(wǎng)址,不管是主動推送還是手動提交,前提都是要整理網(wǎng)站的鏈接,手動添加太麻煩,于是就想寫個腳本直接抓取全站鏈接并導(dǎo)出,本文詳細介紹的是實現(xiàn)的方法及過程,需要的朋友們一起來看看吧。2017-07-07
django之對FileField字段的upload_to的設(shè)定方法
今天小編就為大家分享一篇django之對FileField字段的upload_to的設(shè)定方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Flask框架學(xué)習(xí)筆記(一)安裝篇(windows安裝與centos安裝)
Flask是一個輕量級的Web應(yīng)用框架, 使用Python編寫。Flask也被稱為 “microframework” ,因為它使用簡單的核心,用 extension 增加其他功能。2014-06-06
python機器學(xué)習(xí)使數(shù)據(jù)更鮮活的可視化工具Pandas_Alive
今天我分享大家一款非常棒的動畫可視化工具:Pandas_Alive,它以?matplotlib?繪圖為后端,不僅可以創(chuàng)建出令人驚嘆的動畫可視化,而且使用方法非常簡單。本文詳情如下2021-11-11
Pytorch+PyG實現(xiàn)EdgeCNN過程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實現(xiàn)EdgeCNN過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04

