学习笔记,仅供参考,有错必纠
参考自: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.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:
<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 pathfrom . import views
from django.conf.urls import include
urlpatterns = [
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 = 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)
向http://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()
向http://127.0.0.1:8000/book/book_list/?p=2发起请求:
查看cmd中的输出:
数据条数:102, 页数:11, 页面区间:range(1, 12)当前页: 2
当前这一页的第一条数据的索引值: 11
【本文转自:日本cn2服务器 http://www.558idc.com/jap.html提供,感恩】