W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Django 提供了適用于很多應(yīng)用的基本視圖類(lèi)。所有視圖繼承自 ?View
?類(lèi),它處理視圖鏈接到 ?URLs
?,HTTP 方法調(diào)度和其他簡(jiǎn)單功能。?RedirectView
?用于 HTTP 重定向,?TemplateView
? 擴(kuò)展基類(lèi)來(lái)使它能渲染模板。
使用通用視圖最直接的方式是在 ?URLconf
?中直接創(chuàng)建它們。如果你只在基于類(lèi)的視圖上改變一些屬性,那么你可以把它們傳遞到 ?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ù)將覆蓋在類(lèi)上設(shè)置的屬性。在這個(gè)例子中,我們?cè)??TemplateView
?上設(shè)置 ?template_name
?。一個(gè)相似的覆蓋模式可用于 ?RedirectView
?上的 url 屬性。
使用通用視圖更有力的方式是繼承已存在的視圖并覆蓋子類(lèi)里的屬性(比如 ?template_name
?)或方法(比如 ?get_context_data
?)來(lái)提供新的值或方法。例如,考慮只顯示一個(gè) ?about.html
? 模板的視圖。Django 的 ?TemplateView
?可以完成這個(gè)工作,因此我們可以將其子類(lèi)化并重寫(xiě)模板名稱(chēng):
# some_app/views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
最后我們需要在 ?URLconf
?中添加這個(gè)新視圖。?TemplateView
?只是一個(gè)類(lèi),而不是一個(gè)函數(shù),因此我們將 URL 指向 ?as_view()
? ,它為基于類(lèi)的視圖提供一個(gè)類(lèi)似函數(shù)的入口:
# urls.py
from django.urls import path
from some_app.views import AboutView
urlpatterns = [
path('about/', AboutView.as_view()),
]
如果某人想將視圖作為 API 來(lái)訪(fǎng)問(wèn)圖書(shū)館。API 客戶(hù)端會(huì)時(shí)不時(shí)地連接并下載上次訪(fǎng)問(wèn)過(guò)后出版的書(shū)籍?dāng)?shù)據(jù)。但如果沒(méi)有新的書(shū)籍出現(xiàn),那么從數(shù)據(jù)庫(kù)中獲取書(shū)籍,渲染一個(gè)完整響應(yīng)并發(fā)送它到客戶(hù)端的話(huà),這將浪費(fèi)CPU時(shí)間和帶寬。當(dāng)出版最新的書(shū)時(shí),它訪(fǎng)問(wèn) API 最好。
我們需要在 ?URLconf
?中映射 URL 到書(shū)籍列表視圖:
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
?請(qǐng)求訪(fǎng)問(wèn)視圖,將在響應(yīng)(使用 ?book_list.html
? 模板)中返回一個(gè)干凈的對(duì)象列表。但如果客戶(hù)端發(fā)出一個(gè) ?HEAD
?請(qǐng)求,那么將響應(yīng)一個(gè)空 ?body
?和 ?Last-Modified
? 頭將標(biāo)識(shí)最新書(shū)籍的出版時(shí)間?;谶@些信息,客戶(hù)端可以選擇是否下載一個(gè)完整的對(duì)象類(lèi)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: