类视图

在写视图的时候,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)

对以上代码进行解释:

  1. 首先ArticleListView是继承自ListView
  2. model:重写model类属性,指定这个列表是给哪个模型的。
  3. template_name:指定这个列表的模板。
  4. paginate_by:指定这个列表一页中展示多少条数据。
  5. context_object_name:指定这个列表模型在模板中的参数名称。
  6. ordering:指定这个列表的排序方式。
  7. page_kwarg:获取第几页的数据的参数名称。默认是page
  8. get_context_data:获取上下文的数据。
  9. get_queryset:如果你提取数据的时候,并不是要把所有数据都返回,那么你可以重写这个方法。将一些不需要展示的数据给过滤掉。

Paginator和Page类:

PaginatorPage类都是用来做分页的。他们在Django中的路径为django.core.paginator.Paginatordjango.core.paginator.Page。以下对这两个类的常用属性和方法做解释:

Paginator常用属性和方法:

  1. count:总共有多少条数据。
  2. num_pages:总共有多少页。
  3. page_range:页面的区间。比如有三页,那么就range(1,4)

Page常用属性和方法:

  1. has_next:是否还有下一页。
  2. has_previous:是否还有上一页。
  3. next_page_number:下一页的页码。
  4. previous_page_number:上一页的页码。
  5. number:当前页。
  6. start_index:当前这一页的第一条数据的索引值。
  7. 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)-类视图相关推荐

  1. 最浅显易懂的Django系列教程(20)-查询操作

    查询操作 查找是数据库操作中一个非常重要的技术.查询一般就是使用filter.exclude以及get三个方法来实现.我们可以在调用这些方法的时候传递不同的参数来实现查询需求.在ORM层面,这些查询条 ...

  2. STM32 基础系列教程 31 – DAC

    前言 学习stm32 DAC数模转换接口使用,学会用STM32 的DAC接口,通过DAC接口将数字信号转变成模拟信号输出,或查看内部变量值的变化波形,学习DAC波形发生器的使用. 示例详解 基于硬件平 ...

  3. as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]

    系列文章介绍 本系列文章将详细介绍将Django官方引导教程中的投票项目改写为RESTful网络服务.Django官方教程地址https://docs.djangoproject.com/zh-han ...

  4. Django框架之CBV类视图及类视图装饰器

    前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...

  5. Django系列教程:三、动态视图和动态Url

    注明:python版本为3.3.1.Django版本为1.5.1,操作系统为Windows7,其他版本有一些不同的地方读者可以自行探讨. 前一章我们简略的讲解了下Django的视图和Url的配置,那么 ...

  6. 原理图的设置和几个小操作-PCB系列教程3-1

    工欲善其事,必先利其器,想要画图溜一点,要熟悉自己的工具. 原理图常用系统参数设置 原理图常用的系统参数一般不用专门设置,保持默认即可.如果需要设置,点击屏幕在屏幕右上角的"齿轮图标&quo ...

  7. C# .NETCORE3.1 系列教程(二) MVC视图(View)及标记帮助器(TagHelper)的使用入门

    视图简介 在 ASP.NET MVC 应用程序中,所有传入的请求均由控制器处理,并将这些请求映射到控制器相应的方法上 控制器方法可能会返回一个视图,也可能执行其它类型的操作,例如重定向到另一个控制器方 ...

  8. 《Python全栈系列教程》目录

    专栏地址:<Python全栈基础教程> 专栏结构(即本文目录导航): 〇.前言 一.专栏目录: Python基础部分 Python常用模块部分 Python小技巧部分 Python Web ...

  9. Diango博客--13.将“视图函数”类转化为“类视图”

    文章目录 0.思路引导 1.ListView 2.将 index 视图函数改写为类视图 3.将 category 视图函数改写为类视图 4.将 archive 视图函数改写成类视图 5.将 tag 视 ...

最新文章

  1. 转:要么学习,要么走人!直面竞争的30条生存原则
  2. 环境监控告警系统之TIM即时消息推送部署(二)
  3. Serverless 解惑——函数计算如何安装字体
  4. C++ 备忘录 ( 持续更新中... )
  5. Java设计模式之行为型:解释器模式
  6. 《多元统计分析》学习笔记之主成分分析
  7. 利用Javascript的“函数重载”实现自定义Alert样式
  8. php+mysql+apache 环境搭建
  9. redirect与forward跳转的区别
  10. 漫谈 Clustering (番外篇): Dimensionality Reduction
  11. 【Codeforces Round #546 (Div. 2) E】Nastya Hasn't Written a Legend【线段树】
  12. 公私钥加解密+数字签名原理图(原创)
  13. MSVCR71.dll is missing from your computer-(Window7 install sqldeveloper for oracle )
  14. 25日—你看蓝蓝的天
  15. 汽车车身修复技术【2】
  16. 砍价永远差一刀?拼多多法庭上回复:小数点后有6位......
  17. 兴华苑社区关爱空巢老人社会实践
  18. 盘点视频剪辑几个场景和技巧分享
  19. 爲什麽一个标准的反相器中PMOS管的寬長比要比N管大
  20. 人生有时需要“跳一跳”

热门文章

  1. 2023湖北师范大学计算机考研信息汇总
  2. 好用的云笔记具备哪些特点,这3款云笔记亲测好用
  3. UVa272-TEX Quotes
  4. 把Apple ID 账号改成QQ邮箱教程
  5. Vue 引入高德地图 vue-amap
  6. 第一次实验报告:使用Packet Tracer分析HTTP数据包
  7. 经典力学中最难的问题,至今没有答案
  8. 发挥搜索引擎和工具书的大作用
  9. [转帖]LNMP组件安装
  10. 创业基础(第五章:商业模式及其设计与创新) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习