欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Django通用視圖中的函數(shù)包裝

 更新時間:2015年07月21日 16:25:46   投稿:goldensun  
這篇文章主要介紹了詳解Django通用視圖中的函數(shù)包裝,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下

用函數(shù)包裝來處理復(fù)雜的數(shù)據(jù)過濾

另一個常見的需求是按URL里的關(guān)鍵字來過濾數(shù)據(jù)對象。 之前,我們在URLconf中硬編碼了出版商的名字,但是如果我們想用一個視圖就顯示某個任意指定的出版商的所有書籍,那該怎么辦呢? 我們可以通過對 object_list 通用視圖進行包裝來避免 寫一大堆的手工代碼。 按慣例,我們先從寫URL配置開始:

urlpatterns = patterns('',
 (r'^publishers/$', list_detail.object_list, publisher_info),
 **(r'^books/(\w+)/$', books_by_publisher),**
)

接下來,我們寫 books_by_publisher 這個視圖:

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}
 )

這樣寫沒問題,因為通用視圖就是Python函數(shù)。 和其他的視圖函數(shù)一樣,通用視圖也是接受一些 參數(shù)并返回 HttpResponse 對象。 因此,通過包裝通用視圖函數(shù)可以做更多的事。

注意

注意在前面這個例子中我們在 extra_context中傳遞了當前出版商這個參數(shù)。
處理額外工作

我們再來看看最后一個常用模式:

想象一下我們在 Author 對象里有一個 last_accessed 字段,我們用這個字段來記錄最近一次對author的訪問。 當然通用視圖 object_detail 并不能處理這個問題,但是我們?nèi)匀豢梢院苋菀椎鼐帉懸粋€自定義的視圖來更新這個字段。

首先,我們需要在URL配置里設(shè)置指向到新的自定義視圖:

from mysite.books.views import author_detail

urlpatterns = patterns('',
 # ...
 **(r'^authors/(?P<author_id>\d+)/$', author_detail),**
 # ...
)

接下來寫包裝函數(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 模板,否則這段代碼不能真正工作。

我們可以用同樣的方法修改通用視圖的返回值。 如果我們想要提供一個供下載用的 純文本版本的author列表,我們可以用下面這個視圖:

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

這個方法之所以工作是因為通用視圖返回的 HttpResponse 對象可以象一個字典 一樣的設(shè)置HTTP的頭部。 隨便說一下,這個 Content-Disposition 的含義是 告訴瀏覽器下載并保存這個頁面,而不是在瀏覽器中顯示它。

相關(guān)文章

最新評論