Django 类视图学习笔记(二)基础类视图


导言:本篇主要介绍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'),
]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值