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. mysql备份参数--master-data和--dump-slave的介绍

    [mysql@db2 ~]$ mysqldump -A --master-data=2 > master2.sql[mysql@db2 ~]$ mysqldump -A --master-dat ...

  2. Codeforces Round #505

    Codeforces Round #505 A. Doggo Recoloring 题目描述:给定一个字符串,每次选择一个在字符串里面出现至少两次的字符,然后将这种字符变成那一种指定的字符,问最终这个 ...

  3. Scrapy项目之User timeout caused connection failure(异常记录)

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 提示:此文存在问题,真正测试, 请勿阅读, 07-14 14:26更新: 经过两个多小时的测试,发现此问题的原因是 ...

  4. Isolate randomforest检测异常点的非监督方法

    由于异常数据的两个特征(少且不同: few and different) 异常数据只占很少量; 异常数据特征值和正常数据差别很大. iTree的构成过程如下: l  随机选择一个属性Attr: l  ...

  5. JAVA随笔(三)

    私有是针对类的,而不是对象. static 函数,其实是类函数.之前一直不太理解每个类中的static main是什么意思,为什么main中不能直接调用非静态的变量:因为main是 类函数,不是属于某 ...

  6. 使用mui框架打开页面的几种不同方式

    1.创建子页面: list.html就是index.html的子页面,创建代码比较简单,如下: mui.init({ subpages: [{ url: 'list.html', //子页面HTML地 ...

  7. ROS二进制日志包 ROS binary logger package

    原文网址: 1 http://www.ros.org/news/2017/02/ros-binary-logger-package.html 2 https://github.com/CNR-ITIA ...

  8. 34、疯狂java讲义第三版

    内容中包含 base64string 图片造成字符过多,拒绝显示

  9. mysql索引(btree索引和hash索引的区别)

    所有MySQL列类型可以被索引.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节.大多数存储引擎有更高的限制. 索引的存储类型目前只有 ...

  10. 一步一步学习IdentityServer4 (5) .NETCore2.0 Swagger

    首先添加nuget: Swashbuckle.AspNetCore services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new ...