深入Django(1): 通用視圖 (generic views)

來源:互聯網
上載者:User
文章目錄
  • 1. 回顧Django的視圖函數(view function)
  • 2. 在視圖函數中使用模板
  • 3. 簡化視圖函數的兩個工具
  • 4. 使用通用視圖函數

如果對Django的基礎部分尚不熟悉,請參考《Django實戰》系列。

內容提要
1. 回顧Django的視圖函數(view function)
2. 在視圖函數中使用模板
3. 簡化視圖函數的兩個工具
4. 使用通用視圖函數
5. Django提供的通用視圖

1. 回顧Django的視圖函數(view function)

Django中將視圖定義為一種函數,我們稱其為視圖函數(view function)。當Django架構接收到http請求的時候,從定義的urlpatterns中尋找url運算式進行匹配,一旦找到匹配的項,就將HTTPRequest以及匹配到的其他字串作為參數,調用找到的視圖函數,然後根據視圖函數返回的HTTPResponse對象進行響應。所以視圖函數應該至少接收一個django.http.HTTPRequest對象作為參數,並返回django.http.HTTPResponse對象,如下:

def my_view(request, *args, **kwargs):<br /> response = HTTPResponse()<br /> … ...<br /> return response

 

2. 在視圖函數中使用模板

視圖函數返回的response對象中包含一些頭(Header)資訊和內容(Content),而我們通常通過模板來產生內容,所以我們經常用到的視圖函數應該是這樣:

 

def my_view_with_template(request, *args, **kwargs):<br /> var1 = foo<br /> var2 = bar<br /> t = get_template('path_name_of_template_file')<br /> c = Context({'key1':var1,'key2':var2})<br /> content = t.render( c)<br /> return HTTPResponse(content)<br />

 

3. 簡化視圖函數的兩個工具

總是寫這樣的代碼實在是讓人厭倦,所以Django為我們提供了兩個有用的工具:
一個是django.shortcuts.render_to_response函數,接收一系列的參數,包括模板路徑、context使用的字典、原始的context執行個體以及要設定的mimetype等:
     render_to_response(template_path_name, dictionary=None, context_instance=None, mimetype=None)
另一個是locals()函數,將所有的局部變數組裝成一個字典。
有了這兩個工具,視圖函數就可以這樣寫:

def my_view_with_template(request, *args, **kwargs):<br /> var1 = foo<br /> var2 = bar<br /> return render_to_response('path_name_of_template_file', locals())<br />

 

4. 使用通用視圖函數

有了這兩個工具,編寫視圖函數確實可以簡化很多。但是這樣你就滿意了嗎?Django並沒有就此止步,更進一步注意到,很多視圖函數其實都在做同樣的事情,比如顯示一組模型對象的列表,顯示模型對象的詳細資料,對模型對象的增、刪、改操作等。為了簡化對這些情況的處理,Django定義了一系列的通用視圖(generic views),我們只需要使用這些內建的通用視圖函數,而無需自己編寫就可以實現相應的功能。

使用通用視圖的方法是在URLconf檔案中建立參數字典,將字典作為URLconf元組的第三個成員,即可自動在調用視圖函數時向其傳遞參數了。比如在django.views.generic.list_detail模組中的object_list函數,用於顯示模型對象的列表,可以接受queryset參數作為模型對象的結果集。如果我們要用該視圖函數顯示在《Django實戰》系列中的建立的第一個模型類Product的列表,可以在URLconf中這樣配置:

from django.conf.urls.defaults import *<br />from django.views.generic import list_detail<br />from depot.depotapp.models import Product</p><p>product_info = {<br /> 'queryset': Product.objects.all(),<br />}</p><p>urlpatterns = patterns('',<br /> (r'^product/list/$', list_detail.object_list, product_info)<br />)<br />

 

除了queryset外,object_list函數還可以接收許多其他的參數:

 

object_list(request, queryset, paginate_by=None, page=None, allow_empty=True,<br /> template_name=None, template_loader=loader, extra_context=None,<br /> context_processors=None, template_object_name='object', mimetype=None<br />)

 

通用視圖函數接收到參數後,會建立context,並渲染模板,最後返回HTTPResponse對象。object_list函數建立的context中會包含以下字典項:

  object_list             要顯示的對象的list
  is_paginated         是否分頁
  results_per_page 如果分頁,儲存每頁記錄數
  has_next              是否有下一頁
  has_previous       是否有上一頁
  page                     當前頁碼
  next                      下一頁
  previous               上一頁
  pages                   總頁數
  hits                       總條目數
  last_on_page       本頁最後錄一條記錄的序數(從1開始)
  first_on_page       本頁第一條記錄的序數(從1開始)
  page_range          頁碼範圍的列表

如果這些context字典項不能滿足你的需要,還可以通過指定extra_context參數,傳入一個字典,該字典中的內容會被合并到context字典中。

context字典項會被模板使用。如果不指定模板,該函數將使用[app_name]/[model_name]_list.html作為模板,指定模板的方法也是通過參數字典,比如:

product_info = {<br /> 'queryset': Product.objects.all(),<br /> 'template_name': 'depotapp/another_product_list.html'),<br /> }

這個參數字典會傳入template_name參數來指定渲染的模板檔案。

5. Django提供的通用視圖

除了object_list外,Django還提供了許多通用視圖函數,分布在幾個模組中:

django.views.generic.list_detail模組
  • object_list      顯示模型對象列表   
  • object_detail  顯示單個模型對象
django.views.generic.create_update模組
  • create_object    建立模型對象
  • update_object   修改模型對象
  • delete_object    刪除模型對象
django.views.generic.simple模組
  • direct_to_template   直接使用指定的模板渲染給定的context對象
  • redirect_to   重新導向到指定的url
django.views.generic.date_based模組

這個模組主要處理“按時間查看存檔”的功能,來源於新聞出版行業。具體包括:

  • archive_index   最頂級的歸檔,列出所有年份及指定數量的最新對象
  • archive_year     按年歸檔,列出所有擁有對象的月份
  • archive_month   按月歸檔,列出本月的所有對象,找到擁有對象的上一個、下一個月份
  • archive_week     按周歸檔,列出本周的所有對象
  • archive_day     按日歸檔,列出當天的所有對象,找到擁有對象的上一個、下一個日期
  • archive_today     當前日期(今天)的按日歸檔
  • object_detail     顯示按照年/月/日/序號找到的對象

這些通用視圖函數不再一一介紹,可以參考Django API文檔,關注其參數,context內容和預設範本,就能基本掌握其使用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.