导言:本篇主要介绍Django的基础类视图,包括 View、TemplateView、RedirectView。
一、View
class : django.views.generic.base.View
所有基于类的视图都继承自该基类。
(1)属性
- http_method_names :一个该视图可以接收的HTTP Method的列表。默认为:
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
(2)方法
- as_view(**initkwargs) :类方法。该方法会返回一个函数,该函数会接受request参数并返回类视图的实例对象。该实例对象有两个属性:view_class 和 view_initkwargs。示例:
response = MyView.as_view()(request)
- setup(request, *args, **kwargs) :初始化视图的实例属性,这包括HTTPRequest以及从url中捕捉到的参数。重写此方法以便Maxin设置实例属性,重写此方法需显式调用super。
- dispatch(request, *args, **kwargs) :接受Request请求和其它参数,并生成Response响应。
【注】关于类视图工作的大致流程:
首先调用as_view()方法,该方法返回一个接受了request参数的函数,该函数生成类视图的实例,并调用setup初始化实例对象。之后该实例对象调用dispatch()方法去决定到底该响应类视图的哪部分内容,如果什么都没有匹配到,则抛出 HttpResponseNotAllowed 。
- http_method_not_allowed(request, *args, **kwargs) :如果dispatch()没有匹配到任何方法,则会调用该方法。该方法默认返回 HttpResponseNotAllowed 以及一个包含该类视图支持的所有HTTP Method的列表。你可以重写该方法已获得更好的错误处理效果。
二、TemplateView
class :django.views.generic.base.TemplateView
一个用于呈现模板的简单类视图。
该视图继承自以下视图:
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.base.ContextMixin
- django.views.generic.base.View
示例:
from django.views.generic.base import TemplateView
from article.models import Article
class ArticleList(TemplateView):
template_name = 'list.html'
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['latest_articles'] = Article.objects.all()[:5]
return context
三、RedirectView
class :django.views.generic.base.RedirectView
用于重定向的视图,继承自View。该视图会根据捕捉到的url重定向合适的页面,如果url为空,则返回 HttpResponseGone (410)。
(1)属性
- url :重定向的url,其值为一个字符串,若url为空则返回410 (Gone) HTTP错误。
- pattern_name :要重定向的url的name,即在urls.py模块的path()语句中定义的name。
- permanent :重定向是否应该是永久性的。这里唯一的区别是返回的HTTP状态代码。如果为True,则重定向将使用状态代码301。如果为False,则重定向将使用状态代码302。默认情况下,permanent是False.
- query_string :是否将当前页面的Get参数延用至重定向的页面。如果为True,则延用,如果为False,则丢弃。默认是False。
(2)方法
- get_redirect_url(*args, **kwargs) :构造用于重定向的url。默认使用url作为初始值,如果url未设置,则使用pattern_name。
示例:
views.py:
from django.shortcuts import get_object_or_404
from django.views.generic.base import RedirectView
from article.models import Article
class ArticleCounterRedirectView(RedirectView):
permanent = False
query_string = True
pattern_name = 'article-detail'
def get_redirect_url(self,*args,**kwargs):
article = get_object_or_404(Article, pk=kwargs['pk'])
article.update_counter()
return super().get_redirect_url(*args, **kwargs)
urls.py :
from django.urls import path
from django.views.generic.base import RedirectView
from article.views import ArticleCounterRedirectView, ArticleDetail
urlpatterns = [
path('counter/<int:pk>/', ArticleCounterRedirectView.as_view(), name='article-counter'),
path('details/<int:pk>/', ArticleDetail.as_view(), name='article-detail'),
]