[TOC]
>[success] # ListView
~~~
先来看ListView的流程:
1.请求到达之后,首先会调用distpatch进行分发。
2.接着会调用get方法
3.在get请求中,首先会调用get_queryset方法,拿到数据源
4.接着继续调用get_context_data方法,拿到需要渲染到模板中的数据
5.在get_context_data中,首先会去调用get_paginate_by拿到每页数据
6.接着调用get_context_object_name拿到要渲染到模板中的这个queryset名称 *
7.然后调用paginate_queryset进行分页处理 *
8.把拿到的数据转为dict,返回
9.调用render_to_response渲染数据到页面中
10.在render_to_response中会调用get_tempalte_names拿到模板名
11.然后把request, context, template_name等传递到模板中
~~~
* 文档中的截图
![](https://box.kancloud.cn/eb3d041fa1f2b5e5883ba214462f938a_644x466.png)
* 文档中的用法
~~~
from django.views.generic.list import ListView
from django.utils import timezone
from articles.models import Article
class ArticleListView(ListView):
model = Article
def get_context_data(self, **kwargs):
context = super(ArticleListView, self).get_context_data(**kwargs)
context['now'] = timezone.now()
return context
~~~
~~~
from django.conf.urls import url
from article.views import ArticleListView
urlpatterns = [
url(r'^$', ArticleListView.as_view(), name='article-list'),
]
~~~
~~~
<h1>Articles</h1>
<ul>
{% for article in object_list %}
<li>{{ article.pub_date|date }} - {{ article.headline }}</li>
{% empty %}
<li>No articles yet.</li>
{% endfor %}
</ul>
~~~
* 源码中初始化参数
~~~
allow_empty = True
queryset = None
model = None
paginate_by = None
paginate_orphans = 0
context_object_name = None
paginator_class = Paginator
page_kwarg = 'page'
ordering = None
~~~
>[success] # 博客中的ListView 案例
>[danger] ##### url设计
~~~
from django.conf.urls import url
from django.contrib import admin
from blong.views import IndexView, CategoryView, TagView, PostView
from config.views import links
from .custom_site import custom_site
urlpatterns = [
url(r"^$", IndexView.as_view()),
url(r'^category/(?P<category_id>\d+)/$', CategoryView.as_view(), name="category"),
url(r'^tag/(?P<tag_id>\d+)/$', TagView.as_view(), name="tag"),
url(r'^post/(?P<pk>\d+)/$', PostView.as_view(),name="detail"),
url(r'^links/$', links),
url(r'^admin/', admin.site.urls),
url(r'^cus_admin/', custom_site.urls),
]
~~~
>[danger] ##### 分析讲解
~~~
1.博客中首页数据来自post 数据,不过来源有三种分别是,category,tag,all,依次
对应,分类,标签,和所有 也就是查询的都是post 只不过对应三种状态
2.可以自定义一个基类,对应三个子类,三个子类分别操作 category,tag,all,三种
状态 分类,标签,和所有都和post 有关联
3.想编辑查询语句 重写get_queryset 方法
4.model 声明的是对应的数据库类
5.template_name 对应的模板信息
6.context_object_name 对应html 页面k 值,当我们用模板语言的时候需要告诉接受
查询k名称
7.paginate_by 分页的时候页面显示的条数
~~~
>[danger] ##### 通用类
~~~
1.这个通用类在博客系统中的逻辑是,上下标题栏,侧边栏,最新评价,和最新文章
2.多个类都用了这部分可以做提取,其中get_category_context()做的是二次提取
3.当我们想返回的数据大于,系统帮我们默认通过get_queryset()查询返回的数据还要
多的时候 ,重写get_context_data
~~~
~~~
from pprint import pprint as pp
from django.shortcuts import render
from django.http import Http404
from django.core.paginator import Paginator,EmptyPage
from django.views.generic import ListView, DetailView,FormView
from django.db import connection
from .models import Post, Tag, Categroy
from config.models import SideBar
from comment.models import Comment
# Create your views here.
class CommonMixin:
def get_category_context(self):
categories = Categroy.objects.filter(status=1) # TODO: fix magic number
nav_cates = []
cates = []
for cate in categories:
if cate.is_nav:
nav_cates.append(cate)
else:
cates.append(cate)
return {
'nav_cates': nav_cates,
'cates': cates,
}
def get_context_data(self, **kwargs):
side_bar = SideBar.objects.filter(status=1)
recently_posts = Post.objects.filter(status=1)[:10]
recently_comments = Comment.objects.filter(status=1)[:10]
kwargs.update({
'side_bars': side_bar,
'recently_posts': recently_posts,
"recently_comments": recently_comments
})
kwargs.update(self.get_category_context())
return super(CommonMixin, self).get_context_data(**kwargs) # ** 解码
~~~
>[danger] ##### 基类代码
~~~
class BasePostsView(CommonMixin,ListView):
model = Post
template_name = 'blog/list.html'
context_object_name = "posts"
paginate_by = 3
allow_empty = True
~~~
>[danger] ##### 首页代码
~~~
1.get_queryset()默认查询配置项所有数据,也就是 object.all()
~~~
~~~
class IndexView(BasePostsView):
pass
~~~
>[danger] ##### 分类数据展示代码
~~~
1.重写get_queryset() 方法,因为分类数据是去查询和post 一对多关系的category_id
2.我们在url 用了捕获正则,要获取 正则的值self.kwargs.get('category_id')
3.一定要先super 父类,通过父类的all,在fittler 过滤查询我们想要的数据
4.继承了基类 BasePostsView
~~~
~~~
class CategoryView(BasePostsView):
def get_queryset(self):
qs = super(CategoryView, self).get_queryset()
cate_id = self.kwargs.get('category_id')
qs = qs.filter(category_id=cate_id)
return qs
~~~
>[danger] ##### 标签数据展示代码
~~~
1.当我们想查询的数据不一定是,我们定义model 数据,可以重写get_queryset()方法
2.熟练使用当获取单个对象用get
3.捕获单个对象get 异常用Tag.DoesNotExist
~~~
~~~
class TagView(BasePostsView):
def get_queryset(self):
tag_id = self.kwargs.get("tag_id")
try:
tag = Tag.objects.get(id=tag_id)
except Tag.DoesNotExist:
return []
posts = tag.post_set.all()
return posts
~~~
- 网络原理
- 为搭建框架做准备
- 简单认识网路
- 自定义模拟网站案例
- 优化最终框架
- 数据存储 -- data
- 用户个人信息存储 -- User.txt
- 路由映射 -- routes
- 处理用户信息 -- routes_static.py
- 保存静态文件 -- static
- templates -- html 集中处理模块
- 首页 -- index.html
- 登陆 -- login.html
- 用户注册页面 -- register
- 日志模块 -- log.gua.txt
- 启动文件--server.py
- orm处理 -- model.py
- 日志模块 -- utils.py
- 两种数据库类型
- 传统数据库了解篇
- 前端快速入门
- JS简单使用入门
- css简单快速入门
- DJANGO
- virtualenv-创建虚拟环境
- 项目结构
- django-admin中文配置
- django-打印sql语句
- django-基础
- 认识MVC和MTV
- Django--初识
- Django--初识案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-数据库配置
- ORM-model字段
- ORM-model字段解释
- ORM-字段选项
- ORM-查询
- ORM-四种常用查询方法
- ORM-三种获取数据
- ORM-其他查询方式
- ORM-条件查询双线
- ORM-Q和F条件使用
- ORM-三种数据库交互
- 案例 -- 一对多
- ORM-技巧/常见问题
- ORM-N+1 问题
- ORM-并发的处理
- ORM-数量查询、
- ORM-正向反向查询
- ORM-基础案例一
- ORM-基础一对多案例
- Django-templates
- Django-模板的继承
- Django-模板的过滤
- Django-自定义模板的过滤
- Django-cookie
- Django-cookies 装饰器
- Djang-session
- Django-CSRF
- Django-中间件 -- 后续了解
- Django- 缓存 -- 没有深入了解
- Django-form
- From-ajax
- form-内部验证处理
- form-属性
- form-常用的标签字段
- form-常用的下拉和选择
- form-widget速查
- Django-ajax序列化
- Django-多种ajax写法
- ajax-原生写法
- ajax-$写法
- ajax-ifram
- Django-ajax图片上传
- ajax-原始写法
- ajax-正常写法
- iframe+form
- 实战写法
- Django-常用自编写组件
- Django-双菜单组合搜索
- Django - 多菜单组合搜索
- Django-分页
- django-综合基础
- 综合基础-render
- django-admin
- admin-页面配置
- admin-字段配置
- admin-编辑页面
- admin-forms验证
- admin-创建抽象类
- django-验证码
- 验证码-第三方生成库
- 验证码-view.py使用
- 验证码-注意引入Monaco.ttf
- django-用户注册
- 注册-form 模块
- 注册-views 模块
- 注册-html模块
- 注册-model模块
- django-用户登录三种
- session登录
- form-session 写法
- view-写法
- Html-写法
- model-写法
- 继承类登录
- 外键关联登录
- django-简单的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和数据库关联的写法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系统
- APP目录-models.py 创建
- APP目录-基础展示数据分析
- APP目录-基础数据展示cls
- ListView
- DetailView
- FormView
- 额外功能拓建
- 添加文章搜索/用户文章查询功能
- 增加一个友情链接
- 增加一个评论模块
- App-利用Bootstrap4 搭建样式
- 项目crm
- 思维导图
- perfectCRM-项目名字
- settings.py-配置
- view.py-登陆/登出函数
- crm-app文件
- model.py-表的创建
- admin.py-注册后台
- view.py-视图层
- static-静态文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首页模板