09: TemplateView , ListView ,DetailView三种常用类视图用法
1.1 视图混合介绍
1、Mixin和View的职能区分
1. Mixin提供数据,View提供模板和渲染,所以一般get_context_data在Mixin中,get(),post(),head()在View中
2. Mixin和View不是能随意组合的,必须要注意他们之间的方法的解析顺序,也就是MRO
2、ContextMixin
1. 直接就是一个get_context_data,用于返回context数据。
3、View
1. 会调用所有的get方法,post方法,具体是这些['get', 'post', 'put', 'delete', 'head', 'options', 'trace']
2. View中是没有返回一个response的,所以光继承View的话,必须要重写get等,以返回一个response。
4、TemplateResponseMixin
1. 故名思议,这个Mixin会加入Template的基本信息,也就是template的名字
2. 但是光有Template信息是没有用的,因为她没有跟View想联系起来,如果想要跟View联系起来的话必须想
办法把render_to_response插进MRO的调用顺序,而且TemplateResponseMixin是没有context的信息的
3. 有一个可以借鉴的方法就是TemplateView的做法, Mixin和View把原来的试图函数中的三个东西分开了
模板(TemplateResponseMixin),
上下文数据(ContextMixin),
负责将这些联系起来的一个东西(View)
5、TemplateView
1. TemplateView就继承自TemplateResponseMixin,ContextMixin以及View,所以它的调用思路就很明确了
2. 在其中定义一个get方法,然后通过get方法去将上面的三个东西联系在一起.
3. 我们可以看一下TemplateView的源代码
1.2 TemplateView 基本使用
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/', views.HomePageView.as_view(),name='home'),
]
urls.py
from django.db import models class Article(models.Model):
name = models.CharField(max_length=32)
age = models.SmallIntegerField() def __str__(self):
return self.name
app01/models.py
from django.views.generic.base import TemplateView
from app01.models import Article 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]
print(context)
return context # 返回给前端页面字典,context内容
context = {'latest_articles':"<QuerySet [<Article: zhangsan>, <Article: lisi>, <Article: wangwu>]>", # 表中获取的数据
'view':" <app01.views.HomePageView object at 0x06A2B470>"} # 视图返回的页面
app01/views.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>home</h1> {% for article in latest_articles%}
{{article.name}}
{% endfor %} </body>
</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使用举例
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/', views.HomePageView.as_view(),name='home'),
]
urls.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models class Article(models.Model):
name = models.CharField(max_length=32)
age = models.SmallIntegerField() def __str__(self):
return self.name
app01/models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from django.shortcuts import render
from django.views.generic import ListView from app01.models import Article class HomePageView(ListView):
template_name = 'home.html'
model = Article
context_object_name = 'article_list' # 指定获取的模型列表数据保存的变量名 def get_queryset(self, ):
'''get_queryset函数常处理对数据库表查询结果'''
print self.request.GET # GET请求的所有参数都可以在这里获取 queryset = self.model.objects.all()[:2] # 根据GET请求的条件对Article表进行过滤
return queryset def get_context_data(self, **kwargs):
'''get_context_data 可以携带其他信息,就如常规中设置的字典'''
print self.request.GET # GET请求的所有参数都可以在这里获取 context = super(HomePageView, self).get_context_data(**kwargs)
context['k1'] = 'v1'
context['k2'] = 'v2'
return context
app01/views.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>home</h1>
<!--1、后端如果设置:context_object_name = 'article_list' 这里就可以获取到值了 -->
<div>
{% for article in article_list%}
{{article.name}}
{% endfor %}
</div> <!--2、如果后端没有设置 context_object_name 默认表查询的queryset=object_list -->
<div>
{% for object in object_list %}
{{object.name}}
{% endfor %}
</div> <!--3、后端通过context传的字典直接可以获取 -->
<p>{{ k1 }}</p>
<p>{{ k2 }}</p>
</body>
</html>
home.html

1.4 DetailView
1、DetailView作用
1) 除了从数据库中获取模型列表的数据外,从数据库获取模型的一条记录数据也是常见的需求。
2) 比如查看某篇文章的详情,就是从数据库中获取这篇文章的记录然后渲染模板,DetailView 专门提供了这种功能
blog/views.py from django.views.generic import ListView, DetailView # 记得在顶部导入 DetailView
class PostDetailView(DetailView):
# 这些属性的含义和 ListView 是一样的
model = Post
template_name = 'blog/detail.html'
context_object_name = 'post' def get(self, request, *args, **kwargs):
# 覆写 get 方法的目的是因为每当文章被访问一次,就得将文章阅读量 +1
# get 方法返回的是一个 HttpResponse 实例
# 之所以需要先调用父类的 get 方法,是因为只有当 get 方法被调用后,
# 才有 self.object 属性,其值为 Post 模型实例,即被访问的文章 post
response = super(PostDetailView, self).get(request, *args, **kwargs) # 将文章阅读量 +1
# 注意 self.object 的值就是被访问的文章 post
self.object.increase_views() # 视图必须返回一个 HttpResponse 对象
return response def get_object(self, queryset=None):
# 覆写 get_object 方法的目的是因为需要对 post 的 body 值进行渲染
post = super(PostDetailView, self).get_object(queryset=None)
post.body = markdown.markdown(post.body,
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
'markdown.extensions.toc',
])
return post def get_context_data(self, **kwargs):
# 覆写 get_context_data 的目的是因为除了将 post 传递给模板外(DetailView 已经帮我们完成),
# 还要把评论表单、post 下的评论列表传递给模板。
context = super(PostDetailView, self).get_context_data(**kwargs)
form = CommentForm()
comment_list = self.object.comment_set.all()
context.update({
'form': form,
'comment_list': comment_list
})
return context
DetailView
09: TemplateView , ListView ,DetailView三种常用类视图用法的更多相关文章
- TemplateView , ListView ,DetailView三种常用类视图用法
参考博客: https://blog.csdn.net/weixin_36571185/article/details/74280102
- Django ListView DetailView等基于类的视图如何添加装饰器?
场景: Django开发中,如果我们使用了类视图,如:ListView.DetailView.UpdateView等,这时我们又想要对这个视图添加一个装饰器,来实现某种功能,这时候该怎么处理呢? 环境 ...
- Part 4:表单和类视图--Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- Django 类视图
引文 所有的类视图都继承django.views.generic.base.View类. 在URLconf中简单的使用通用视图 如果只是简单的做一些属性修改,可以使用as_view()方法,如下所示: ...
- 六、Django之表单和类视图-Part 4
一.表单form 为了接收用户的投票选择,我们需要在前端页面显示一个投票界面.让我们重写先前的polls/detail.html文件,代码如下: <h1>{{ question.quest ...
- Django(27)类视图
类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...
- Django内置的通用类视图
1.ListView 表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性: model: 指定模型 te ...
- Django学习笔记之视图高级-类视图
类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...
- python的Web框架,类视图
类视图 范式 from django.views import View # 继承View class IndexView(View): def get(self, request): #写法和函数视 ...
随机推荐
- 洛谷P2178 品酒大会【后缀数组】【单调栈】
题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...
- POJ3660 Cow Contest【最短路-floyd】
N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we ...
- .NET中的类型对象
.NET中的任何类型,都有对应的一个类型对象.类型对象和类型实例(类型创建的一个对象)不是同一个概念. 类型对象包含类型的静态字段和方法,当类访问静态方法静态字段,实例调用方法时就会去类型对象中查找静 ...
- ubuntu16.04下笔记本电脑扩展双屏安装过程
想给笔记本电脑外界一个显示屏,因为科研需要,我的笔记本是windows10加Ubuntu16.04双系统,主要使用Ubuntu系统. 首先是硬件 一个外置显示屏是必须的了,然后我的笔电上只有HDMI接 ...
- Linux:32/64位程序(应用程序、共享库、内核模块)
摘要: Linux系统区分32/64位,相应地,应用程序.共享库和内核模块也区分32/64位. 本文以Ubuntu系统为例,介绍如何编译和使用32/64位的应用程序.共享库和内核模块. 1. 应用程序 ...
- python面向对象高级:定制类
Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类. 比如: __str__ 与__repr____iter____getitem____call__ __str__ 与__r ...
- ubuntu x64 debootstrap
sudo debootstrap jessie /mnt/jessie http://mirrors.163.com/debian
- chrome Sources选项卡 设置JavaScript事件断点
chrome console 可以查看执行的javascript么? 举个例子: 比如这张图片,163邮箱,我点击上一封邮件和下一封邮件执行的是javascript方法. 虽然在chrome的cons ...
- IO流(4)重命名
重命名功能:public boolean renameTo(File dest) * 如果路径名相同,就是改名. * 如果路径名不同,就是改名并剪切. * * 路径以盘符开始:绝对路径 c:\\a.t ...
- web 开发常见问题--GET POST 区别
首先,get和post是什么? --两种 HTTP 请求方法:GET 和 POST HTTP Request Methods GET.POST 专业名称是 HTTP Request Methods.但 ...