当前位置 : 主页 > 编程语言 > python >

Django从理论到实战(part47)--ListView类

来源:互联网 收集:自由互联 发布时间:2022-06-15
学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y; 文章目录 ​​类视图​​ ​​ListView类​​ ​​举个例子​​ ​​Paginator和Page类​​ ​​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 makemigrations
python manage.py migrate



我们用Navicat连接sqlite数据库:

Django从理论到实战(part47)--ListView类_django



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

Django从理论到实战(part47)--ListView类_django_02



现在,我们在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 include

urlpatterns = [
path('add_book/', views.add_book),
path('book_list/', views.ArticleListView.as_view()),
]



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

Django从理论到实战(part47)--ListView类_数据_03



再看看数据库中的book_list表,可以看到表内已经填充了数据:
Django从理论到实战(part47)--ListView类_数据_04



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

Django从理论到实战(part47)--ListView类_django_05



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

Django从理论到实战(part47)--ListView类_django_06



现在,我们更改一下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/发起请求:

Django从理论到实战(part47)--ListView类_django_07



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发起请求:

Django从理论到实战(part47)--ListView类_html_08



查看cmd中的输出:

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



【本文转自:日本cn2服务器 http://www.558idc.com/jap.html提供,感恩】
上一篇:Django(part22)--创建数据对象
下一篇:没有了
网友评论