最浅显易懂的Django系列教程(31)-类视图
类视图
在写视图的时候,Django
除了使用函数作为视图,也可以使用类作为视图。使用类视图可以使用类的一些特性,比如继承等。
View:
django.views.generic.base.View是主要的类视图,所有的类视图都是继承自他。如果我们写自己的类视图,也可以继承自他。然后再根据当前请求的method
,来实现不同的方法。比如这个视图只能使用get
的方式来请求,那么就可以在这个类中定义get(self,request,*args,**kwargs)
方法。以此类推,如果只需要实现post
方法,那么就只需要在类中实现post(self,request,*args,**kwargs)
。示例代码如下:
from django.views import View
class BookDetailView(View):def get(self,request,*args,**kwargs):return render(request,'detail.html')
类视图写完后,还应该在urls.py
中进行映射,映射的时候就需要调用View
的类方法as_view()
来进行转换。示例代码如下:
urlpatterns = [ path("detail/<book_id>/",views.BookDetailView.as_view(),name='detail')
]
除了get
方法,View
还支持以下方法['get','post','put','patch','delete','head','options','trace']
。
如果用户访问了View
中没有定义的方法。比如你的类视图只支持get
方法,而出现了post
方法,那么就会把这个请求转发给http_method_not_allowed(request,*args,**kwargs)
。示例代码如下:
class AddBookView(View):def post(self,request,*args,**kwargs):return HttpResponse("书籍添加成功!")def http_method_not_allowed(self, request, *args, **kwargs):return HttpResponse("您当前采用的method是:%s,本视图只支持使用post请求!" % request.method)
urls.py
中的映射如下:
path("addbook/",views.AddBookView.as_view(),name='add_book')
如果你在浏览器中访问addbook/
,因为浏览器访问采用的是get
方法,而addbook
只支持post
方法,因此以上视图会返回您当前采用的method
是:GET
,本视图只支持使用post
请求!。
其实不管是get
请求还是post
请求,都会走dispatch(request,*args,**kwargs)
方法,所以如果实现这个方法,将能够对所有请求都处理到。
TemplateView:
django.views.generic.base.TemplateView,这个类视图是专门用来返回模版的。在这个类中,有两个属性是经常需要用到的,一个是template_name
,这个属性是用来存储模版的路径,TemplateView
会自动的渲染这个变量指向的模版。另外一个是get_context_data
,这个方法是用来返回上下文数据的,也就是在给模版传的参数的。示例代码如下:
from django.views.generic.base import TemplateViewclass HomePageView(TemplateView):template_name = "home.html"def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['username'] = "黄勇"return context
在urls.py
中的映射代码如下:
from django.urls import pathfrom myapp.views import HomePageViewurlpatterns = [path('', HomePageView.as_view(), name='home'),
]
如果在模版中不需要传递任何参数,那么可以直接只在urls.py
中使用TemplateView
来渲染模版。示例代码如下:
from django.urls import path
from django.views.generic import TemplateViewurlpatterns = [path('about/', TemplateView.as_view(template_name="about.html")),
]
ListView:
在网站开发中,经常会出现需要列出某个表中的一些数据作为列表展示出来。比如文章列表,图书列表等等。在Django
中可以使用ListView
来帮我们快速实现这种需求。示例代码如下:
class ArticleListView(ListView):model = Articletemplate_name = 'article_list.html'paginate_by = 10context_object_name = 'articles'ordering = 'create_time'page_kwarg = 'page'def get_context_data(self, **kwargs):context = super(ArticleListView, self).get_context_data(**kwargs)print(context)return contextdef get_queryset(self):return Article.objects.filter(id__lte=89)
对以上代码进行解释:
- 首先
ArticleListView
是继承自ListView
。 model
:重写model
类属性,指定这个列表是给哪个模型的。template_name
:指定这个列表的模板。paginate_by
:指定这个列表一页中展示多少条数据。context_object_name
:指定这个列表模型在模板中的参数名称。ordering
:指定这个列表的排序方式。page_kwarg
:获取第几页的数据的参数名称。默认是page
。get_context_data
:获取上下文的数据。get_queryset
:如果你提取数据的时候,并不是要把所有数据都返回,那么你可以重写这个方法。将一些不需要展示的数据给过滤掉。
Paginator和Page类:
Paginator
和Page
类都是用来做分页的。他们在Django
中的路径为django.core.paginator.Paginator
和django.core.paginator.Page
。以下对这两个类的常用属性和方法做解释:
Paginator常用属性和方法:
count
:总共有多少条数据。num_pages
:总共有多少页。page_range
:页面的区间。比如有三页,那么就range(1,4)
。
Page常用属性和方法:
has_next
:是否还有下一页。has_previous
:是否还有上一页。next_page_number
:下一页的页码。previous_page_number
:上一页的页码。number
:当前页。start_index
:当前这一页的第一条数据的索引值。end_index
:当前这一页的最后一条数据的索引值。
给类视图添加装饰器:
在开发中,有时候需要给一些视图添加装饰器。如果用函数视图那么非常简单,只要在函数的上面写上装饰器就可以了。但是如果想要给类添加装饰器,那么可以通过以下两种方式来实现:
装饰dispatch方法:
from django.utils.decorators import method_decoratordef login_required(func):def wrapper(request,*args,**kwargs):if request.GET.get("username"):return func(request,*args,**kwargs)else:return redirect(reverse('index'))return wrapperclass IndexView(View):def get(self,request,*args,**kwargs):return HttpResponse("index")@method_decorator(login_required)def dispatch(self, request, *args, **kwargs):super(IndexView, self).dispatch(request,*args,**kwargs)
直接装饰在整个类上:
from django.utils.decorators import method_decorator
def login_required(func):def wrapper(request,*args,**kwargs):if request.GET.get("username"):return func(request,*args,**kwargs)else:return redirect(reverse('login'))return wrapper@method_decorator(login_required,name='dispatch')
class IndexView(View):def get(self,request,*args,**kwargs):return HttpResponse("index")def dispatch(self, request, *args, **kwargs):super(IndexView, self).dispatch(request,*args,**kwargs)
看文章不过瘾?还有免费的视频教程,让你学起来更轻松:Django零基础到项目实战
最浅显易懂的Django系列教程(31)-类视图相关推荐
- 最浅显易懂的Django系列教程(20)-查询操作
查询操作 查找是数据库操作中一个非常重要的技术.查询一般就是使用filter.exclude以及get三个方法来实现.我们可以在调用这些方法的时候传递不同的参数来实现查询需求.在ORM层面,这些查询条 ...
- STM32 基础系列教程 31 – DAC
前言 学习stm32 DAC数模转换接口使用,学会用STM32 的DAC接口,通过DAC接口将数字信号转变成模拟信号输出,或查看内部变量值的变化波形,学习DAC波形发生器的使用. 示例详解 基于硬件平 ...
- as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]
系列文章介绍 本系列文章将详细介绍将Django官方引导教程中的投票项目改写为RESTful网络服务.Django官方教程地址https://docs.djangoproject.com/zh-han ...
- Django框架之CBV类视图及类视图装饰器
前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...
- Django系列教程:三、动态视图和动态Url
注明:python版本为3.3.1.Django版本为1.5.1,操作系统为Windows7,其他版本有一些不同的地方读者可以自行探讨. 前一章我们简略的讲解了下Django的视图和Url的配置,那么 ...
- 原理图的设置和几个小操作-PCB系列教程3-1
工欲善其事,必先利其器,想要画图溜一点,要熟悉自己的工具. 原理图常用系统参数设置 原理图常用的系统参数一般不用专门设置,保持默认即可.如果需要设置,点击屏幕在屏幕右上角的"齿轮图标&quo ...
- C# .NETCORE3.1 系列教程(二) MVC视图(View)及标记帮助器(TagHelper)的使用入门
视图简介 在 ASP.NET MVC 应用程序中,所有传入的请求均由控制器处理,并将这些请求映射到控制器相应的方法上 控制器方法可能会返回一个视图,也可能执行其它类型的操作,例如重定向到另一个控制器方 ...
- 《Python全栈系列教程》目录
专栏地址:<Python全栈基础教程> 专栏结构(即本文目录导航): 〇.前言 一.专栏目录: Python基础部分 Python常用模块部分 Python小技巧部分 Python Web ...
- Diango博客--13.将“视图函数”类转化为“类视图”
文章目录 0.思路引导 1.ListView 2.将 index 视图函数改写为类视图 3.将 category 视图函数改写为类视图 4.将 archive 视图函数改写成类视图 5.将 tag 视 ...
最新文章
- 转:要么学习,要么走人!直面竞争的30条生存原则
- 环境监控告警系统之TIM即时消息推送部署(二)
- Serverless 解惑——函数计算如何安装字体
- C++ 备忘录 ( 持续更新中... )
- Java设计模式之行为型:解释器模式
- 《多元统计分析》学习笔记之主成分分析
- 利用Javascript的“函数重载”实现自定义Alert样式
- php+mysql+apache 环境搭建
- redirect与forward跳转的区别
- 漫谈 Clustering (番外篇): Dimensionality Reduction
- 【Codeforces Round #546 (Div. 2) E】Nastya Hasn't Written a Legend【线段树】
- 公私钥加解密+数字签名原理图(原创)
- MSVCR71.dll is missing from your computer-(Window7 install sqldeveloper for oracle )
- 25日—你看蓝蓝的天
- 汽车车身修复技术【2】
- 砍价永远差一刀?拼多多法庭上回复:小数点后有6位......
- 兴华苑社区关爱空巢老人社会实践
- 盘点视频剪辑几个场景和技巧分享
- 爲什麽一个标准的反相器中PMOS管的寬長比要比N管大
- 人生有时需要“跳一跳”