詳解Django通用視圖中的函數(shù)包裝
用函數(shù)包裝來(lái)處理復(fù)雜的數(shù)據(jù)過(guò)濾
另一個(gè)常見(jiàn)的需求是按URL里的關(guān)鍵字來(lái)過(guò)濾數(shù)據(jù)對(duì)象。 之前,我們?cè)赨RLconf中硬編碼了出版商的名字,但是如果我們想用一個(gè)視圖就顯示某個(gè)任意指定的出版商的所有書籍,那該怎么辦呢? 我們可以通過(guò)對(duì) object_list 通用視圖進(jìn)行包裝來(lái)避免 寫一大堆的手工代碼。 按慣例,我們先從寫URL配置開始:
urlpatterns = patterns('', (r'^publishers/$', list_detail.object_list, publisher_info), **(r'^books/(\w+)/$', books_by_publisher),** )
接下來(lái),我們寫 books_by_publisher 這個(gè)視圖:
from django.shortcuts import get_object_or_404 from django.views.generic import list_detail from mysite.books.models import Book, Publisher def books_by_publisher(request, name): # Look up the publisher (and raise a 404 if it can't be found). publisher = get_object_or_404(Publisher, name__iexact=name) # Use the object_list view for the heavy lifting. return list_detail.object_list( request, queryset = Book.objects.filter(publisher=publisher), template_name = 'books/books_by_publisher.html', template_object_name = 'book', extra_context = {'publisher': publisher} )
這樣寫沒(méi)問(wèn)題,因?yàn)橥ㄓ靡晥D就是Python函數(shù)。 和其他的視圖函數(shù)一樣,通用視圖也是接受一些 參數(shù)并返回 HttpResponse 對(duì)象。 因此,通過(guò)包裝通用視圖函數(shù)可以做更多的事。
注意
注意在前面這個(gè)例子中我們?cè)?extra_context中傳遞了當(dāng)前出版商這個(gè)參數(shù)。
處理額外工作
我們?cè)賮?lái)看看最后一個(gè)常用模式:
想象一下我們?cè)?Author 對(duì)象里有一個(gè) last_accessed 字段,我們用這個(gè)字段來(lái)記錄最近一次對(duì)author的訪問(wèn)。 當(dāng)然通用視圖 object_detail 并不能處理這個(gè)問(wèn)題,但是我們?nèi)匀豢梢院苋菀椎鼐帉懸粋€(gè)自定義的視圖來(lái)更新這個(gè)字段。
首先,我們需要在URL配置里設(shè)置指向到新的自定義視圖:
from mysite.books.views import author_detail urlpatterns = patterns('', # ... **(r'^authors/(?P<author_id>\d+)/$', author_detail),** # ... )
接下來(lái)寫包裝函數(shù):
import datetime from django.shortcuts import get_object_or_404 from django.views.generic import list_detail from mysite.books.models import Author def author_detail(request, author_id): # Delegate to the generic view and get an HttpResponse. response = list_detail.object_detail( request, queryset = Author.objects.all(), object_id = author_id, ) # Record the last accessed date. We do this *after* the call # to object_detail(), not before it, so that this won't be called # unless the Author actually exists. (If the author doesn't exist, # object_detail() will raise Http404, and we won't reach this point.) now = datetime.datetime.now() Author.objects.filter(id=author_id).update(last_accessed=now) return response
注意
除非你添加 last_accessed 字段到你的 Author 模型并創(chuàng)建 books/author_detail.html 模板,否則這段代碼不能真正工作。
我們可以用同樣的方法修改通用視圖的返回值。 如果我們想要提供一個(gè)供下載用的 純文本版本的author列表,我們可以用下面這個(gè)視圖:
def author_list_plaintext(request): response = list_detail.object_list( request, queryset = Author.objects.all(), mimetype = 'text/plain', template_name = 'books/author_list.txt' ) response["Content-Disposition"] = "attachment; filename=authors.txt" return response
這個(gè)方法之所以工作是因?yàn)橥ㄓ靡晥D返回的 HttpResponse 對(duì)象可以象一個(gè)字典 一樣的設(shè)置HTTP的頭部。 隨便說(shuō)一下,這個(gè) Content-Disposition 的含義是 告訴瀏覽器下載并保存這個(gè)頁(yè)面,而不是在瀏覽器中顯示它。
相關(guān)文章
使用Python連接MySQL數(shù)據(jù)庫(kù)進(jìn)行編程的步驟詳解
Python數(shù)據(jù)庫(kù)編程可以使用多種模塊與API,例如SQLite、MySQL、PostgreSQL等,本教程將重點(diǎn)介紹使用Python連接MySQL數(shù)據(jù)庫(kù)進(jìn)行編程,需要的朋友可以參考下2023-06-06Django配置Bootstrap, js實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Django配置Bootstrap, js實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Django項(xiàng)目如何正確配置日志(logging)
本文將教你如何在Django項(xiàng)目中正確配置日志(logging),讓Django生成log日志文件,并在程序運(yùn)行發(fā)生error級(jí)別故障時(shí)通知管理員。2021-04-04matplotlib.pyplot畫圖 圖片的二進(jìn)制流的獲取方法
今天小編就為大家分享一篇matplotlib.pyplot畫圖 圖片的二進(jìn)制流的獲取方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python多線程實(shí)現(xiàn)支付模擬請(qǐng)求過(guò)程解析
這篇文章主要介紹了python多線程實(shí)現(xiàn)支付模擬請(qǐng)求過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Pandas的read_csv函數(shù)參數(shù)分析詳解
這篇文章主要介紹了Pandas的read_csv函數(shù)參數(shù)分析詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07使用python對(duì)excle和json互相轉(zhuǎn)換的示例
今天小編就為大家分享一篇使用python對(duì)excle和json互相轉(zhuǎn)換的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10python中time模塊指定格式時(shí)間字符串轉(zhuǎn)為時(shí)間戳
本文主要介紹了python中time模塊指定格式時(shí)間字符串轉(zhuǎn)為時(shí)間戳,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02使用django實(shí)現(xiàn)一個(gè)代碼發(fā)布系統(tǒng)
這篇文章主要介紹了使用django實(shí)現(xiàn)一個(gè)代碼發(fā)布系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python Pandas中創(chuàng)建Series的三種方法總結(jié)
這篇文章主要介紹了Python Pandas中創(chuàng)建Series的三種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06