Django4.0 基于類的視圖-基礎(chǔ)示例

2022-03-16 17:49 更新

Django 提供了適用于很多應(yīng)用的基本視圖類。所有視圖繼承自 ?View ?類,它處理視圖鏈接到 ?URLs?,HTTP 方法調(diào)度和其他簡單功能。?RedirectView ?用于 HTTP 重定向,?TemplateView? 擴(kuò)展基類來使它能渲染模板。

在URLconf中的用法

使用通用視圖最直接的方式是在 ?URLconf ?中直接創(chuàng)建它們。如果你只在基于類的視圖上改變一些屬性,那么你可以把它們傳遞到 ?as_view()? 方法中調(diào)用:

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path('about/', TemplateView.as_view(template_name="about.html")),
]

任何傳遞到 ?as_view()?  的參數(shù)將覆蓋在類上設(shè)置的屬性。在這個例子中,我們在 ?TemplateView ?上設(shè)置 ?template_name ?。一個相似的覆蓋模式可用于 ?RedirectView ?上的 url 屬性。

子類化通用視圖

使用通用視圖更有力的方式是繼承已存在的視圖并覆蓋子類里的屬性(比如 ?template_name ?)或方法(比如 ?get_context_data ?)來提供新的值或方法。例如,考慮只顯示一個 ?about.html? 模板的視圖。Django 的 ?TemplateView ?可以完成這個工作,因此我們可以將其子類化并重寫模板名稱:

# some_app/views.py
from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

最后我們需要在 ?URLconf ?中添加這個新視圖。?TemplateView ?只是一個類,而不是一個函數(shù),因此我們將 URL 指向 ?as_view()? ,它為基于類的視圖提供一個類似函數(shù)的入口:

# urls.py
from django.urls import path
from some_app.views import AboutView

urlpatterns = [
    path('about/', AboutView.as_view()),
]

支持其他HTTP方法

如果某人想將視圖作為 API 來訪問圖書館。API 客戶端會時不時地連接并下載上次訪問過后出版的書籍?dāng)?shù)據(jù)。但如果沒有新的書籍出現(xiàn),那么從數(shù)據(jù)庫中獲取書籍,渲染一個完整響應(yīng)并發(fā)送它到客戶端的話,這將浪費(fèi)CPU時間和帶寬。當(dāng)出版最新的書時,它訪問 API 最好。

我們需要在 ?URLconf ?中映射 URL 到書籍列表視圖:

from django.urls import path
from books.views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view()),
]

還有視圖:

from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book

class BookListView(ListView):
    model = Book

    def head(self, *args, **kwargs):
        last_book = self.get_queryset().latest('publication_date')
        response = HttpResponse(
            # RFC 1123 date format.
            headers={'Last-Modified': last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT')},
        )
        return response

如果從 ?GET ?請求訪問視圖,將在響應(yīng)(使用 ?book_list.html? 模板)中返回一個干凈的對象列表。但如果客戶端發(fā)出一個 ?HEAD ?請求,那么將響應(yīng)一個空 ?body ?和 ?Last-Modified? 頭將標(biāo)識最新書籍的出版時間?;谶@些信息,客戶端可以選擇是否下載一個完整的對象類。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號