1.1 视图混合介绍

  1MixinView的职能区分

      1. Mixin提供数据,View提供模板和渲染,所以一般get_context_data在Mixin中,get(),post(),head()在View中
      2. Mixin和View不是能随意组合的,必须要注意他们之间的方法的解析顺序,也就是MRO

  2ContextMixin

      1. 直接就是一个get_context_data,用于返回context数据。

  3View

      1. 会调用所有的get方法,post方法,具体是这些['get', 'post', 'put', 'delete', 'head', 'options', 'trace']
      2. View中是没有返回一个response的,所以光继承View的话,必须要重写get等,以返回一个response。

  4TemplateResponseMixin

      1. 故名思议,这个Mixin会加入Template的基本信息,也就是template的名字

      2. 但是光有Template信息是没有用的,因为她没有跟View想联系起来,如果想要跟View联系起来的话必须想
          办法把render_to_response插进MRO的调用顺序,而且TemplateResponseMixin是没有context的信息的

      3. 有一个可以借鉴的方法就是TemplateView的做法, Mixin和View把原来的试图函数中的三个东西分开了
        模板(TemplateResponseMixin),
        上下文数据(ContextMixin),
        负责将这些联系起来的一个东西(View)

  5TemplateView

      1. TemplateView就继承自TemplateResponseMixin,ContextMixin以及View,所以它的调用思路就很明确了
      2. 在其中定义一个get方法,然后通过get方法去将上面的三个东西联系在一起.
      3. 我们可以看一下TemplateView的源代码

1.2 TemplateView 基本使用

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^home/', views.HomePageView.as_view(),name='home'),
  8. ]

urls.py

  1. from django.db import models
  2.  
  3. class Article(models.Model):
  4. name = models.CharField(max_length=32)
  5. age = models.SmallIntegerField()
  6.  
  7. def __str__(self):
  8. return self.name

app01/models.py

  1. from django.views.generic.base import TemplateView
  2. from app01.models import Article
  3.  
  4. class HomePageView(TemplateView):
  5.  
  6. template_name = "home.html" #视图返回的页面
  7.  
  8. def get_context_data(self, **kwargs): #向上下文变量中添加额外的数据
  9. context = super(HomePageView, self).get_context_data(**kwargs)
  10. context['latest_articles'] = Article.objects.all()[:5]
  11. print(context)
  12. return context
  13.  
  14. # 返回给前端页面字典,context内容
  15. context = {'latest_articles':"<QuerySet [<Article: zhangsan>, <Article: lisi>, <Article: wangwu>]>", # 表中获取的数据
  16. 'view':" <app01.views.HomePageView object at 0x06A2B470>"} # 视图返回的页面

app01/views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>home</h1>
  9.  
  10. {% for article in latest_articles%}
  11. {{article.name}}
  12. {% endfor %}
  13.  
  14. </body>
  15. </html>

home.html

1.3 ListView

参考官网: https://docs.djangoproject.com/en/2.0/ref/class-based-views/generic-display/#listview

参考博客: https://www.zmrenwu.com/post/33/

  1、ListView作用

      作用:ListView 作用是按照指定方式向数据库获取表中数据

  2、ListView使用举例

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^home/', views.HomePageView.as_view(),name='home'),
  8. ]

urls.py

  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.db import models
  4.  
  5. class Article(models.Model):
  6. name = models.CharField(max_length=32)
  7. age = models.SmallIntegerField()
  8.  
  9. def __str__(self):
  10. return self.name

app01/models.py

  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3.  
  4. from django.shortcuts import render
  5. from django.views.generic import ListView
  6.  
  7. from app01.models import Article
  8.  
  9. class HomePageView(ListView):
  10. template_name = 'home.html'
  11. model = Article
  12. context_object_name = 'article_list' # 指定获取的模型列表数据保存的变量名
  13.  
  14. def get_queryset(self, ):
  15. '''get_queryset函数常处理对数据库表查询结果'''
  16. print self.request.GET # GET请求的所有参数都可以在这里获取
  17.  
  18. queryset = self.model.objects.all()[:2] # 根据GET请求的条件对Article表进行过滤
  19. return queryset
  20.  
  21. def get_context_data(self, **kwargs):
  22. '''get_context_data 可以携带其他信息,就如常规中设置的字典'''
  23. print self.request.GET # GET请求的所有参数都可以在这里获取
  24.  
  25. context = super(HomePageView, self).get_context_data(**kwargs)
  26. context['k1'] = 'v1'
  27. context['k2'] = 'v2'
  28. return context

app01/views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>home</h1>
  9. <!--1、后端如果设置:context_object_name = 'article_list' 这里就可以获取到值了 -->
  10. <div>
  11. {% for article in article_list%}
  12. {{article.name}}
  13. {% endfor %}
  14. </div>
  15.  
  16. <!--2、如果后端没有设置 context_object_name 默认表查询的queryset=object_list -->
  17. <div>
  18. {% for object in object_list %}
  19. {{object.name}}
  20. {% endfor %}
  21. </div>
  22.  
  23. <!--3、后端通过context传的字典直接可以获取 -->
  24. <p>{{ k1 }}</p>
  25. <p>{{ k2 }}</p>
  26. </body>
  27. </html>

home.html

1.4 DetailView

  1、DetailView作用

      1) 除了从数据库中获取模型列表的数据外,从数据库获取模型的一条记录数据也是常见的需求。

      2) 比如查看某篇文章的详情,就是从数据库中获取这篇文章的记录然后渲染模板,DetailView 专门提供了这种功能

  1. blog/views.py
  2.  
  3. from django.views.generic import ListView, DetailView
  4.  
  5. # 记得在顶部导入 DetailView
  6. class PostDetailView(DetailView):
  7. # 这些属性的含义和 ListView 是一样的
  8. model = Post
  9. template_name = 'blog/detail.html'
  10. context_object_name = 'post'
  11.  
  12. def get(self, request, *args, **kwargs):
  13. # 覆写 get 方法的目的是因为每当文章被访问一次,就得将文章阅读量 +1
  14. # get 方法返回的是一个 HttpResponse 实例
  15. # 之所以需要先调用父类的 get 方法,是因为只有当 get 方法被调用后,
  16. # 才有 self.object 属性,其值为 Post 模型实例,即被访问的文章 post
  17. response = super(PostDetailView, self).get(request, *args, **kwargs)
  18.  
  19. # 将文章阅读量 +1
  20. # 注意 self.object 的值就是被访问的文章 post
  21. self.object.increase_views()
  22.  
  23. # 视图必须返回一个 HttpResponse 对象
  24. return response
  25.  
  26. def get_object(self, queryset=None):
  27. # 覆写 get_object 方法的目的是因为需要对 post 的 body 值进行渲染
  28. post = super(PostDetailView, self).get_object(queryset=None)
  29. post.body = markdown.markdown(post.body,
  30. extensions=[
  31. 'markdown.extensions.extra',
  32. 'markdown.extensions.codehilite',
  33. 'markdown.extensions.toc',
  34. ])
  35. return post
  36.  
  37. def get_context_data(self, **kwargs):
  38. # 覆写 get_context_data 的目的是因为除了将 post 传递给模板外(DetailView 已经帮我们完成),
  39. # 还要把评论表单、post 下的评论列表传递给模板。
  40. context = super(PostDetailView, self).get_context_data(**kwargs)
  41. form = CommentForm()
  42. comment_list = self.object.comment_set.all()
  43. context.update({
  44. 'form': form,
  45. 'comment_list': comment_list
  46. })
  47. return context

DetailView

09: TemplateView , ListView ,DetailView三种常用类视图用法的更多相关文章

  1. TemplateView , ListView ,DetailView三种常用类视图用法

    参考博客: https://blog.csdn.net/weixin_36571185/article/details/74280102

  2. Django ListView DetailView等基于类的视图如何添加装饰器?

    场景: Django开发中,如果我们使用了类视图,如:ListView.DetailView.UpdateView等,这时我们又想要对这个视图添加一个装饰器,来实现某种功能,这时候该怎么处理呢? 环境 ...

  3. Part 4:表单和类视图--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  4. Django 类视图

    引文 所有的类视图都继承django.views.generic.base.View类. 在URLconf中简单的使用通用视图 如果只是简单的做一些属性修改,可以使用as_view()方法,如下所示: ...

  5. 六、Django之表单和类视图-Part 4

    一.表单form 为了接收用户的投票选择,我们需要在前端页面显示一个投票界面.让我们重写先前的polls/detail.html文件,代码如下: <h1>{{ question.quest ...

  6. Django(27)类视图

    类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...

  7. Django内置的通用类视图

    1.ListView 表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性: model: 指定模型 te ...

  8. Django学习笔记之视图高级-类视图

    类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...

  9. python的Web框架,类视图

    类视图 范式 from django.views import View # 继承View class IndexView(View): def get(self, request): #写法和函数视 ...

随机推荐

  1. HDU 1686 - Oulipo - [KMP模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 Time Limit: 3000/1000 MS (Java/Others) Memory Li ...

  2. ios-Objective-C中的各种遍历(迭代)方式(转载)

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  3. 常用的windows注册表大全

    目录 使系统没有“运行”选项                        1让操作系统无“关闭系统” 选项                    2让操作系统无“注销”选项              ...

  4. linux删除指定行&删除行首空格&替换字符

    打印并删除2~1000行 nl /etc/passwd | sed '2,1000d' |more 删除行首空格 sed -i 's/^[][ ]*//g' file 替换分隔符 说明:文件中数据是由 ...

  5. kettle 安装mysql 驱动

    错误连接数据库 [mysql] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying ...

  6. Spark Sort-Based Shuffle具体实现内幕和源码详解

    为什么讲解Sorted-Based shuffle?2方面的原因:一,可能有些朋友看到Sorted-Based Shuffle的时候,会有一个误解,认为Spark基于Sorted-Based Shuf ...

  7. Python 列表 extend() 方法

    描述 Python 列表 extend() 方法通过在列表末尾追加可迭代对象中的元素来扩展列表. 语法 extend() 方法语法: L.extend(iterable) 参数 iterable -- ...

  8. mysql 常用命令 常用SQL语句

    维护命令 数据库 ##创建数据库 mysql> create database test; Query OK, 1 row affected ##删除数据库 mysql> drop dat ...

  9. 申请 Let’s Encrypt 泛域名证书 及 Nginx/Apache 证书配置

    什么是 Let’s Encrypt? 部署 HTTPS 网站的时候需要证书,证书由 CA (Certificate Authority )机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于 ...

  10. [LeetCode] 595. Big Countries_Easy tag: SQL

    There is a table World +-----------------+------------+------------+--------------+---------------+ ...