根據官方網站 https://docs.djangoproject.com/zh-hans/4.1/topics/class-based-views/generic-display/ ,頁面中介紹了Django4中的通用顯示視圖(Generic Display Views)。這些視圖是一種用于展示資料的快速而簡單的方式,可以減少開發者編寫重複代碼的工作量。
頁面中首先介紹了DetailView,它是用于展示單個對象的視圖。它内部定義了一個model屬性,用于指定要展示的模型類。我們可以通過重寫get_queryset()方法來自定義查詢結果集,通過重寫get_context_data()方法來自定義模闆上下文。此外,我們還可以使用template_name屬性來指定模闆檔案。
接下來,頁面介紹了ListView,它是用于展示一個對象清單的視圖。與DetailView類似,ListView也定義了一個model屬性用于指定要展示的模型類。我們可以通過重寫get_queryset()方法來自定義查詢結果集,通過重寫get_context_data()方法來自定義模闆上下文。同樣,我們也可以使用template_name屬性來指定模闆檔案。
除了DetailView和ListView之外,頁面還介紹了TemplateView和RedirectView。TemplateView用于展示一個靜态的模闆頁面,我們可以通過重寫get_template_names()方法來指定模闆檔案。RedirectView用于進行重定向,我們可以通過重寫get_redirect_url()方法來指定重定向的URL。
以下是官方網站給出的4種樣例代碼和說明:
- 使用DetailView展示單個對象的示例代碼:
from django.views.generic.detail import DetailView
from myapp.models import MyModel
class MyModelDetailView(DetailView):
model = MyModel
template_name = 'myapp/mymodel_detail.html'
這段代碼定義了一個MyModelDetailView類,繼承自DetailView。通過設定model屬性為MyModel,指定了要展示的模型類。同時,通過設定template_name屬性為myapp/mymodel_detail.html,指定了模闆檔案。
- 使用ListView展示對象清單的示例代碼:
from django.views.generic.list import ListView
from myapp.models import MyModel
class MyModelListView(ListView):
model = MyModel
template_name = 'myapp/mymodel_list.html'
這段代碼定義了一個MyModelListView類,繼承自ListView。通過設定model屬性為MyModel,指定了要展示的模型類。同時,通過設定template_name屬性為myapp/mymodel_list.html,指定了模闆檔案。
- 使用TemplateView展示靜态模闆頁面的示例代碼:
from django.views.generic.base import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
這段代碼定義了一個AboutView類,繼承自TemplateView。通過設定template_name屬性為about.html,指定了要展示的模闆檔案。
- 使用RedirectView進行重定向的示例代碼:
from django.views.generic.base import RedirectView
class MyRedirectView(RedirectView):
pattern_name = 'another-view'
這段代碼定義了一個MyRedirectView類,繼承自RedirectView。通過設定pattern_name屬性為another-view,指定了要重定向到的URL。
通過以上的示例代碼,我們可以更加清楚地了解Django4中的通用顯示視圖的使用方式,并根據實際需求進行相應的定制和擴充。
Django 4.1 引入了基于類的視圖(Class-Based Views),這是一種更加靈活和可重用的視圖設計方式。基于類的視圖可以讓你通過繼承、組合和混入等方法來複用代碼,進而減少重複代碼和提高代碼的可維護性。
下面我們通過一個簡單的例子來示範如何使用 Django 4.1 的基于類的視圖:
- 首先,在 views.py 檔案中,建立一個基于類的視圖:
from django.http import HttpResponse
from django.views import View
from .models import Person
class IndexView(View):
template_name = 'index.html'
def get(self, request):
person = Person.objects.first() or Person()
return HttpResponse('Hello, {{ person.first_name }}!')
在這個例子中,我們首先從目前目錄下的 models.py 檔案導入了 Person 模型。然後,我們建立了一個名為 IndexView 的基于類的視圖。在這個視圖中,我們定義了一個名為 template_name 的類屬性,用于指定模闆檔案的路徑。接着,我們定義了一個名為 get 的方法,用于處理 HTTP GET 請求。在這個方法中,我們首先擷取資料庫中的第一個 Person 對象,如果沒有則建立一個新的對象。然後,我們傳回一個包含問候語的 HTTP 響應。注意,我們需要在視圖類中定義一個名為 get 的方法來處理 HTTP GET 請求。
- 在項目的 urls.py 檔案中,将 URL 與視圖關聯起來:
from django.urls import path
from . import views
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
]
在這個例子中,我們首先從目前目錄下的 views.py 檔案導入了 IndexView 視圖。然後,我們在項目的 urls.py 檔案中定義了一個 URL 模式,将根 URL(即空字元串)與 IndexView 視圖關聯起來。注意,我們需要使用 IndexView.as_view() 方法來擷取視圖類的執行個體,并将其傳遞給 path() 函數。這樣,當使用者通路根 URL 時,就會調用 IndexView 視圖的 get 方法來處理請求。
- 在項目的模闆目錄下建立一個名為 index.html 的模闆檔案:
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
{% if person %}
<h1>{{ person.first_name }} {{ person.last_name }}</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
</body>
</html>
在這個模闆檔案中,我們首先檢查是否存在 person 變量。如果存在,則顯示該變量的值;否則,顯示預設的問候語 "Hello, World!"。注意,我們需要在模闆中使用雙花括号 {{ variable }} 來輸出變量的值。
在官方網站的這個頁面中,介紹了Django的類視圖(Class-Based Views)中的一個特定類型:通用顯示視圖(Generic Display Views)。這些視圖是用于顯示特定模型對象的通用模闆,可以友善地處理常見的顯示需求。
頁面中給出了一些示例代碼來示範如何使用這些通用顯示視圖。下面我将詳細講解這些示例代碼的含義和用法。
- ListView示例代碼:
from django.views.generic import ListView
from myapp.models import Book
class BookListView(ListView):
model = Book
template_name = 'books.html'
context_object_name = 'book_list'
這段代碼定義了一個名為BookListView的類,繼承自ListView。model屬性指定了該視圖要顯示的模型是Book,template_name屬性指定了模闆檔案的名稱是books.html,context_object_name屬性指定了在模闆中使用的上下文變量的名稱是book_list。這樣,當通路這個視圖時,它會自動查詢資料庫中的Book對象,并将查詢結果傳遞給模闆檔案books.html,在模闆中可以通過book_list變量來通路這些對象。
- DetailView示例代碼:
from django.views.generic import DetailView
from myapp.models import Book
class BookDetailView(DetailView):
model = Book
template_name = 'book_detail.html'
context_object_name = 'book'
slug_field = 'slug'
這段代碼定義了一個名為BookDetailView的類,繼承自DetailView。與ListView相似,model屬性指定了要顯示的模型是Book,template_name屬性指定了模闆檔案的名稱是book_detail.html,context_object_name屬性指定了在模闆中使用的上下文變量的名稱是book,slug_field屬性指定了用于查詢對象的字段是slug。當通路這個視圖時,它會根據提供的slug值查詢資料庫中的Book對象,并将查詢結果傳遞給模闆檔案book_detail.html,在模闆中可以通過book變量來通路這個對象。
- CreateView示例代碼:
from django.views.generic import CreateView
from myapp.models import Book
from myapp.forms import BookForm
class BookCreateView(CreateView):
model = Book
form_class = BookForm
template_name = 'book_create.html'
success_url = '/books/'
這段代碼定義了一個名為BookCreateView的類,繼承自CreateView。model屬性指定了要建立的模型是Book,form_class屬性指定了用于建立表單的表單類是BookForm,template_name屬性指定了模闆檔案的名稱是book_create.html,success_url屬性指定了建立成功後要重定向的URL是/books/。當使用者送出建立表單時,這個視圖會根據表單資料建立一個新的Book對象,并将使用者重定向到/books/頁面。
- UpdateView示例代碼:
from django.views.generic import UpdateView
from myapp.models import Book
from myapp.forms import BookForm
class BookUpdateView(UpdateView):
model = Book
form_class = BookForm
template_name = 'book_update.html'
success_url = '/books/'
slug_field = 'slug'
這段代碼定義了一個名為BookUpdateView的類,繼承自UpdateView。與CreateView相似,model屬性指定了要更新的模型是Book,form_class屬性指定了用于更新表單的表單類是BookForm,template_name屬性指定了模闆檔案的名稱是book_update.html,success_url屬性指定了更新成功後要重定向的URL是/books/,slug_field屬性指定了用于查詢對象的字段是slug。當使用者送出更新表單時,這個視圖會根據表單資料更新對應的Book對象,并将使用者重定向到/books/頁面。
通過以上四種示例代碼,我們可以看到通用顯示視圖的使用方法。它們提供了一種快捷、靈活的方式來處理常見的資料顯示需求,減少了代碼的重複編寫。可以根據具體的需求使用不同的通用顯示視圖來展示不同的模型對象。