Django通用檢視


在某些情況下編寫檢視程式碼,正如我們所看到前面工作真的很繁重。想象一下,只需要一個靜態頁面或列表頁。 Django還提供了一種簡單的方法來設定這些簡單的檢視被稱為通用檢視。

不同於傳統的檢視,一般的檢視是一個類但沒有函式。Django還提供了一組類 django.views.generic 通用檢視,以及每一個普通檢視是這些類或從它們中的一個類繼承的。

有10+泛型類?

>>> import django.views.generic
>>> dir(django.views.generic)

['ArchiveIndexView', 'CreateView', 'DateDetailView', 'DayArchiveView', 
   'DeleteView', 'DetailView', 'FormView', 'GenericViewError', 'ListView', 
   'MonthArchiveView', 'RedirectView', 'TemplateView', 'TodayArchiveView', 
   'UpdateView', 'View', 'WeekArchiveView', 'YearArchiveView', '__builtins__', 
   '__doc__', '__file__', '__name__', '__package__', '__path__', 'base', 'dates', 
   'detail', 'edit', 'list']
你可以使用通用檢視。讓我們來看一些例子來看看它是如何工作的。

靜態網頁

讓我們從「static.html」模板發布靜態頁面。

我們的 static.html ?

<html>
   <body> 
      This is a static page!!! 
   </body>
</html> 

如果我們這樣做,按以前學過的方式,我們將不得不改變 myapp/views.py ?

from django.shortcuts import render

def static(request):
   return render(request, 'static.html', {}) 

myapp/urls.py 如下 ?

from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),) 

最好的辦法就是使用通用檢視。對於這一點,我們的 myapp/views.py 將變成為 ?

from django.views.generic import TemplateView

class StaticView(TemplateView):
   template_name = "static.html" 

而我們的 myapp/urls.py 將如下 ?

from myapp.views import StaticView
from django.conf.urls import patterns

urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),) 

當存取 /myapp/static 將得到 ?

出於同樣的結果,我們也可以,執行下列操作 ?

  • 不需要修改 views.py
  • 更改url.py檔案為 -
from django.views.generic import TemplateView
from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views",
   url(r'^static/',TemplateView.as_view(template_name = 'static.html')),)
正如你所看到的,只需要改變url.py檔案中的第二個方法。

從資料庫列表和顯示資料

我們要列出所有條目在Dreamreal模型。這樣使用ListView通用檢視類變得容易。編輯url.py檔案,並對其進行更新 -

from django.views.generic import ListView
from django.conf.urls import patterns, url

urlpatterns = patterns(
   "myapp.views", url(r'^dreamreals/', ListView.as_view(model = Dreamreal, 
      template_name = "dreamreal_list.html")),
) 

重要的是要注意,在這一點上是變數通由通用檢視到模板為object_list。如果你想自己的名字,將需要一個 context_object_name 引數新增到as_view方法。然後 url.py 成為 -

from django.views.generic import ListView
from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views",
   url(r'^dreamreals/', ListView.as_view(
      template_name = "dreamreal_list.html")),
      model = Dreamreal, context_object_name = 」dreamreals_objects」 ,) 

然後關聯的模板將成為 ?

{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %} 

存取 /myapp/dreamreals/ 將產生如下頁面 ?