Django中ListView类的实战应用,具体到第47部分,有哪些关键点?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1346个文字,预计阅读时间需要6分钟。
《Django打造大型企业官网实践指南》—— 黄Y;
目录:
1. 类视图
2.ListView类
3.示例案例
4.Paginator和Page类
5.Paginator常用属性
学习笔记,仅供参考,有错必纠
参考自: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 makemigrationspython manage.py migrate
我们用Navicat连接sqlite数据库:
打开数据库连接,并打开库,可以看到存在book_article表:
现在,我们在book应用的views.py文件中创建视图函数add_book,用来添加书籍:
from django.shortcuts import renderfrom 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打造大型企业官网实践指南》—— 黄Y;
目录:
1. 类视图
2.ListView类
3.示例案例
4.Paginator和Page类
5.Paginator常用属性
学习笔记,仅供参考,有错必纠
参考自: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 makemigrationspython manage.py migrate
我们用Navicat连接sqlite数据库:
打开数据库连接,并打开库,可以看到存在book_article表:
现在,我们在book应用的views.py文件中创建视图函数add_book,用来添加书籍:
from django.shortcuts import renderfrom 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

