django是mvt模式,其中v就是这个显示逻辑部分,简单来讲,view函数可以说是接收request,然后处理,返回response的主体函数。

对于一些简单的逻辑关系,可以用直接用函数模式来进行处理。

def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)

如上,很明显的逻辑,函数接收request为参数,然后随便做点事情,把内容放到response中返回,剩下的事情django都会帮我们做完。view的中心思想就是这样,处理显示部分的逻辑。

当然,当我们写一些复杂的逻辑的时候,或者说要在一个视图函数里处理get和post的时候,用这种函数式的表达方法会很复杂,也不容易日后维护和扩展,这个时候django就推荐我们用class来表达来逻辑了。

首先,要通过现象看本质,这个view的主要思想就是处理和返回请求的,无论使用def还是class。

先看一下这两个在urls.py是怎么样被绑定的:def是可以直接被引用的,而class是需要引用其as_view的方法, 但是我们可以换个角度看,在设置url映射的时候,不就是绑定了一个函数嘛。

然后在view函数中,他们又有什么不同呢。def函数表达方式,非常直观,接收request,返回response;而class则没有那么直观,要解释他的逻辑,要从django提供的基本view类讲起。

django.views.generic.base.view这个函数就是django所有内置类的爸爸,这个view类有三个方法,dispatch(),http_method_not_allowed(),options()和一个类方法as_view()。

其中,dispatch就是用来判断request的method,看接下来将这个request派到哪里method的处理函数那里去(如果要用def函数式来做这一步,就需要写一大堆if request.method == get 之类的判断),

http_method_not_allowed则是用来过滤掉某些特定method的,options就是用来设置response的一些可选参数。as_view可以理解为class的出口函数。

注意,这个view基类是没有渲染功能的,也就是说他不能和template进行交互,所以,我们需要在这个基础去扩展(这里就体现出class的优越性,如果是函数式则需要整体改动,而这里只需要去继承)

除了上面介绍的view,这个generic view class,还有两个基本的mixin类,按我个人的理解,view可以单独拿来用,他本身是完整的,但是mixin不可以,mixin往往只有单个功能,所以需要将mixin作为插件来加到view中。django提供了两个基本mixin class,一个是ContextMixin,这个mixin就只有一个方法,就是get_context_data,简单来讲,他就是接收一些字典类的参数,然后这些字典传到template去;第二个是TemplateResponseMixin,其实页数可以当作只有一个方法,就是render_to_response,没错,这个跟shortcuts里面那个一样,可以理解成返回已经渲染好了的response。

总得来说,这两个mixin,一个获取context,一个负责render,就已经可以帮助我们完成很多很多事情了。

来两个官方的例子

class HomePageView(TemplateView):

    template_name = "home.html"

    def get_context_data(self, **kwargs):
context = super(HomePageView, self).get_context_data(**kwargs)
context['latest_articles'] = Article.objects.all()[:5]
return context

这个TemplateView也是django内置的,基类,没错,他也是绝大多数内置class的爸爸,当然除了view,他其实就是View,ContextMixin和TemplateResponseMixin的儿子。看一下他的爸爸们,我们很容想到他能干什么,只要为他指定template,然后定义好context的内容,然后就完了,我们就能得到一个渲染好的response了。看源码可以知道,TemplateView里只有一个方法,就是定义了get(),就没了,也就是说当请求的方式是get,然后这个请求会被View.dispatch传到这个get这里,而这个get要做的也不多,第一步,调用ContextMixi.get_context_data,第二步,将第一步得到的context传到TemplalteResponseMixin.render_to_response,然后就没了。由此可见,其实我们要做的往往就是去调用django为我们准备好的一些组件

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(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)

这个RedirectView的主要作用就是重定向,注意其中使用到shortcuts的get_object_or_404

关于django Class-based views的理解的更多相关文章

  1. python 关于django 2.X from django.contrib.auth.views import login

    在学习注册用户的过程中,视图中下面的代码 from django.contrib.auth.views import login 启动django服务时,报错: ImportError: cannot ...

  2. 第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

  3. 三 Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

  4. Understanding Scroll Views 深入理解 scroll view 读书笔记

    Understanding Scroll Views 深入理解 scroll view  读书笔记   It may be hard to believe, but a UIScrollView is ...

  5. Django Class Based View

    本节内容 一   Class Based View 基于类的视图 1.  类的视图 View 2.  类的视图 TemplateView 3.  类的视图 login_required解决方法 二   ...

  6. django中app_name以及namespace理解

    在写django的时候,html中反向解析经常会用到app_name 但有时候又是namespace,具体的区别如下: 大部分情况 这两者有其一就可以了. 并且两者(可以简化理解)无区别 只要一种情况 ...

  7. Django Function Based View(FBV)和Class Based View (CBV)对比

    一.FBV处理过程 首先来看一下FBV逻辑过程: 1.简单过程(借用官方示例): urls: from django.conf.urls import url from . import views ...

  8. Django视图(views)

    1.FBV (基于函数的视图) 实例 url.py url(r'^add_publicer/',views.add_publicer) def add_publicer(request): if re ...

  9. django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)

    models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True),  OneToOneField("Author" ...

随机推荐

  1. shutdown系统调用

    /* * Shutdown a socket. */ SYSCALL_DEFINE2(shutdown, int, fd, int, how) { int err, fput_needed; stru ...

  2. Laravel 5.5 迁移报错:General error: 1215 Cannot add foreign key constraint

    问题 之前一直用的 Laravel 5.4,数据库也是直接写 sql 的,感觉可定制性更强,顺便锻炼下 sql.这次改用了 Laravel 5.5,索性用迁移建库试试,结果报错如下: SQLSTATE ...

  3. swagger学习

    https://segmentfault.com/a/1190000010144742 https://segmentfault.com/a/1190000014775124 https://blog ...

  4. python3 切换工作文件夹

    python3 默认的工作文件夹在Python安装路径下.如下为查看工作文件夹路径: >>> import os >>> os.getcwd() 'D:\\Work ...

  5. idea添加jdbc包

    IDEA版本:IDEA 14 这里我使用的第三方jar包是数据库的JDBC jar包导出案例. 1.创建一个Module,名称为dataBase,在里面我们先创建一个folder用来包含所需要的jar ...

  6. Python 模块进阶

    import导入模块 1. import 搜索路径 import sys sys.path 例子: In [1]: import sys In [2]: sys.path Out[2]: ['', ' ...

  7. 你真的了解js伪数组吗?深入js伪数组

    关于js伪数组 具有length属性: 按索引方式存储数据: 不具有数组的push().pop()等方法: 你可能知道怎么把伪数组转换为数组,但是你知道这里边的原理吗? 假如页面有一组li元素 < ...

  8. java基础81 jsp的内置对象(网页知识)

    1.什么是内置对象? 在jsp开发中,会频繁使用到一些对象,如:HttpSession,ServletContext,HttpServletRequest.      如果每次使用这些对象时,都要去创 ...

  9. java基础17 模板模式

    1.模版模式 解决某类事物的步骤有些是固定的,有些会发生改变的,那么这个时候我们可以为这一类事物提供一个模版代码,从而提高效率. 2.模版模式的步骤 1.先写出解决该类事物的其中一种解决方案;     ...

  10. TCP包服务器接受程序

    //功能:客户端发送TCP包,此程序接受到,将字母转换为大写,在发送到客户端#include <stdio.h>#include <sys/socket.h>#include ...