学习笔记,仅供参考,有错必纠

参考自:Django打造大型企业官网–Huang Y;


文章目录

  • 类视图
    • ListView类
      • 举个例子
    • Paginator和Page类
      • Paginator常用属性
      • Page常用属性和方法
      • 举个例子

类视图

ListView类

在网站开发中,经常会出现需要列出某个表中的一些数据作为列表展示出来,在Django中可以使用ListView类来帮我们快速实现这种需求。

举个例子

首先,我们创建一个book应用,并对该APP在settings.py中进行配置:

python manage.py startapp book

在book应用的models.py文件下,敲入如下代码:

from django.db import models# Create your models here.class Article(models.Model):title = models.CharField(max_length = 30)content = models.TextField()create_time = models.DateTimeField(auto_now_add = True)

进行迁移操作:

python manage.py makemigrations
python manage.py migrate

我们用Navicat连接sqlite数据库:

打开数据库连接,并打开,可以看到存在book_article表:

现在,我们在book应用的views.py文件中创建视图函数add_book,用来添加书籍:

from django.shortcuts import render
from django.http import HttpResponse
from .models import Article
# Create your views here.def add_book(request):articles = []for x in range(0, 102):article = Article(title = "标题: %s" % x, content = "内容:%s" % x)articles.append(article)Article.objects.bulk_create(articles)return HttpResponse("<h2>Are you OK?</h2>")

在book应用的views.py文件中创建ArticleListView类,它继承自ListView类:

class ArticleListView(ListView):model = Article#重写model类属性,指定这个列表是给哪个模型的template_name = "book_list.html"#指定这个列表的模板context_object_name = "articles"#在模板文件中的名字paginate_by = 10#指定这个列表一页中展示多少条数据ordering = 'create_time'#指定这个列表的排序方式page_kwarg = 'p'#获取第几页的数据的参数名称def get_context_data(self, **kwargs):#get_context_data方法用于获取上下文的数据context = super(ArticleListView, self).get_context_data(**kwargs)context["password"] = "anhuicaijingdaxue"print("="*20)print(context)print("="*20)return context

在templates文件夹中创建模板文件book_list.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>展示图书</title>
</head><body>
<ul>
{% for article in articles %}<li>{{ article.title }}</li>{% endfor %}</ul>
</body>

在book应用的urls.py文件中,我们添加路由:

from django.urls import path
from . import views
from django.conf.urls import includeurlpatterns = [path('add_book/', views.add_book),path('book_list/', views.ArticleListView.as_view()),
]

现在,我们向http://127.0.0.1:8000/book/add_book/发起请求:

再看看数据库中的book_list表,可以看到表内已经填充了数据:

向http://127.0.0.1:8000/book/book_list/发起请求:

向http://127.0.0.1:8000/book/book_list/?p=3发起请求:

现在,我们更改一下ArticleListView类,增加get_queryset方法,限制数据返回的条数:

class ArticleListView(ListView):model = Articletemplate_name = "book_list.html"context_object_name = "articles"#在模板文件中的名字paginate_by = 10ordering = 'create_time'page_kwarg = 'p'def get_context_data(self, **kwargs):context = super(ArticleListView, self).get_context_data(**kwargs)context["password"] = "anhuicaijingdaxue"print("="*20)print(context)print("="*20)return contextdef get_queryset(self):return Article.objects.filter(id__lte = 5)

向http://127.0.0.1:8000/book/book_list/发起请求:

Paginator和Page类

PaginatorPage类都是用来做分页的。他们在Django中的路径为django.core.paginator.Paginatordjango.core.paginator.Page

上面的例子中,我们在ArticleListView类的get_context_data方法中打印了context,现在,我们来看一下context的输出结果:

{'paginator': <django.core.paginator.Paginator object at 0x0000009479522FD0>, 'page_obj': <Page 1 of 1>,
'is_paginated': False, 'object_list': <QuerySet [<Article: Articl
e object (1)>, <Article: Article object (2)>, <Article: Article object (3)>, <Article: Article object (4)>, <Article: Article object (5)>]>,
'articles': <QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>, <Article: Article object (4)>, <Article: Article object (5)>]>,
'view': <book.views.ArticleListView object at 0x000000947954D550>, 'password': 'anhuicaijingdaxue'}

可以看到context的输出结果中有一个key为paginator,它所对应的value就是Paginator类的对象,还有一个key为page_obj,它所对应的value为Page类的对象。

Paginator常用属性

属性 含义
count属性 总共有多少条数据
num_pages属性 总共有多少页
page_range属性 页面的区间,比如有3页,那么返回值就是range(1,4)

Page常用属性和方法

属性和方法 含义
has_next方法 是否还有下一页
has_previous方法 是否还有上一页
next_page_number方法 下一页的页码
previous_page_number方法 上一页的页码
number属性 当前页
start_index方法 当前这一页的第一条数据的索引值
end_index方法 当前这一页的最后一条数据的索引值

举个例子

在book应用的views.py文件中,我们重新定义ArticleListView类,并在get_context_data方法中,调用Paginator和Page类对象的属性和方法:

class ArticleListView(ListView):model = Articletemplate_name = "book_list.html"context_object_name = "articles"#在模板文件中的名字paginate_by = 10ordering = 'create_time'page_kwarg = 'p'def get_context_data(self, **kwargs):context = super(ArticleListView, self).get_context_data(**kwargs)paginator = context.get("paginator")page_obj = context.get("page_obj")print("数据条数:{}, 页数:{}, 页面区间:{} ".format(paginator.count, paginator.num_pages, paginator.page_range))print("当前页:", page_obj.number)print("当前这一页的第一条数据的索引值:", page_obj.start_index())return contextdef get_queryset(self):return Article.objects.all()

向http://127.0.0.1:8000/book/book_list/?p=2发起请求:

查看cmd中的输出:

数据条数:102, 页数:11, 页面区间:range(1, 12)
当前页: 2
当前这一页的第一条数据的索引值: 11

Django从理论到实战(part47)--ListView类相关推荐

  1. Django从理论到实战(part46)--View类

    学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 类视图 View类 django.views.generic.base.View是主要的类视图,所有的类视图都是继 ...

  2. Django从理论到实战(part44)--JsonResponse类

    学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: JsonResponse类 如果我们想向浏览器传递Json类型数据,可以使用JsonResponse类.该类会将对 ...

  3. Django从理论到实战(part50)--使用模型来处理上传的文件

    学习笔记,仅供参考,有错必纠 文章目录 使用模型来处理上传的文件 `MEDIA_ROOT`和`MEDIA_URL` 限制文件的扩展名 使用模型来处理上传的文件 在定义模型的时候,我们可以给存储文件的字 ...

  4. Django从理论到实战(part45)--下载CSV文件

    学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 文章目录 CSV文件 生成小的CSV文件 将`csv`文件定义成模板 生成大的CSV文件 StreamingHtt ...

  5. Django从理论到实战(part35)--QuerySetAPI

    学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y:官方文档 QuerySet API 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模 ...

  6. Django从理论到实战(part32)--外键删除

    学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 外键删除 在学习外键删除之前,我们先学习一下外键. 外键 比如,我们有一个User和一个Article两个模型,U ...

  7. Django从理论到实战(part30)--Meta配置

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

  8. Django从理论到实战(part27)--ORM模型的增删改查操作

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

  9. Django从理论到实战(part26)--ORM模型

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

最新文章

  1. 计算机电路门,7.3 门电路计算机操作系统原理.pdf
  2. 【Scratch】青少年蓝桥杯_每日一题_2.23_小猫来回走
  3. linux环境禁用apache目录浏览功能
  4. 详细讲解在Spring中进行集成测试AbstractDependencyInjectionSpringContextTests
  5. 2)机器学习基石笔记Lecture2:Learning to Answer Yes/No
  6. Mybatis.cfg配置标签的顺序问题
  7. hbuilderX里uniapp和php,使用 DCloud 工具 HBuilder X 开发 uni-app 项目踩过的一些坑
  8. 鸟哥linux命令行总结之——文件的压缩打包和备份
  9. 华为账号登录总显示服务器繁忙,愚人节玩笑:华为手机帐号无法登陆,提示网络繁忙...
  10. Web前端学习笔记(十四)---加载动画(旋转方块)
  11. 山东大学项目实训审计系统(七)数据可视化
  12. js table 生成序号_JS自动为表格增加序号
  13. DMCTF writeup
  14. HTML和CSS内容总结
  15. P4 安装bmv2 详细教程(更新中。。)
  16. 1349. 最大公约数
  17. 静态代码分析工具-CasePlayer2
  18. electron-vue 制作悬浮球
  19. 解决UEditor超出最大字数后只提示不限制的问题
  20. 求知讲堂Java视频-基础整理-算术赋值比较逻辑位运算符-基础整理

热门文章

  1. abv asp是静态网页吗_2019年seo动态网页优化“指南针”
  2. java 存储cookie_java设置cookie,存储和读取 | 学步园
  3. java并发核心知识体系精讲_JVM核心知识体系
  4. 计算机高新办公软件应用,OFFICEXP全国计算机信息高新技术考试办公软件应用
  5. birt报表数据只有一条_企业构建大数据分析体系的4个层级
  6. 天兔安装手册-第一篇文章
  7. 使用独立主机时需要关注的问题
  8. app端微信支付(二) - 生成预付单
  9. ACE在AIX环境下编译指南
  10. Maximum.TV 发布西班牙语Silverlight TV网站