Django中ListView类的实战应用,具体到第47部分,有哪些关键点?

2026-06-10 22:391阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1346个文字,预计阅读时间需要6分钟。

Django中ListView类的实战应用,具体到第47部分,有哪些关键点?

《Django打造大型企业官网实践指南》—— 黄Y;

目录:

1. 类视图

2.ListView类

3.示例案例

4.Paginator和Page类

5.Paginator常用属性

Django中ListView类的实战应用,具体到第47部分,有哪些关键点?

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

参考自: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.127.0.0.1:8000/book/add_book/发起请求:



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



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



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



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

class ArticleListView(ListView):
model = Article
template_name = "book_list.html"
context_object_name = "articles"
#在模板文件中的名字
paginate_by = 10
ordering = '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 context

def get_queryset(self):
return Article.objects.filter(id__lte = 5)



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



Paginator和Page类



​​Paginator​​​和​​Page​​​类都是用来做分页的。他们在​​Django​​​中的路径为​​django.core.paginator.Paginator​​​和​​django.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 = Article
template_name = "book_list.html"
context_object_name = "articles"
#在模板文件中的名字
paginate_by = 10
ordering = '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 context

def get_queryset(self):
return Article.objects.all()



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



查看cmd中的输出:

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



本文共计1346个文字,预计阅读时间需要6分钟。

Django中ListView类的实战应用,具体到第47部分,有哪些关键点?

《Django打造大型企业官网实践指南》—— 黄Y;

目录:

1. 类视图

2.ListView类

3.示例案例

4.Paginator和Page类

5.Paginator常用属性

Django中ListView类的实战应用,具体到第47部分,有哪些关键点?

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

参考自: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.127.0.0.1:8000/book/add_book/发起请求:



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



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



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



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

class ArticleListView(ListView):
model = Article
template_name = "book_list.html"
context_object_name = "articles"
#在模板文件中的名字
paginate_by = 10
ordering = '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 context

def get_queryset(self):
return Article.objects.filter(id__lte = 5)



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



Paginator和Page类



​​Paginator​​​和​​Page​​​类都是用来做分页的。他们在​​Django​​​中的路径为​​django.core.paginator.Paginator​​​和​​django.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 = Article
template_name = "book_list.html"
context_object_name = "articles"
#在模板文件中的名字
paginate_by = 10
ordering = '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 context

def get_queryset(self):
return Article.objects.all()



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



查看cmd中的输出:

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