高级视图_ListView类视图

ListView类视图

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

2、即:如果需要在模板中以列表的形式展示一些数据,那么就可以使用ListView类视图来快速实现

3、ListView类视图跟前面介绍的View类视图和TemplateView类视图一样,都是为了方便我们快速实现某些特定功能的类视图
    ⑴这些类视图jango已经封装好了的,我们只需要继承对应的类以及重写某些属性和方法就可以了

例1:
⑴编辑视图

高级视图_ListView类视图

⑵编辑模板

高级视图_ListView类视图

⑶查看数据库数据

高级视图_ListView类视图

⑷访问第一页

高级视图_ListView类视图

⑸访问第二页

高级视图_ListView类视图

注:
1、上面例子中我们只是很简单的写了一个类视图,并继承于ListView类视图,就很容易的实现了一个列表显示页面
    ⑴在从数据库获取数据时,我们并没有使用SQL语句进行查询,只是提供了一个模型名,但成功的从对应表中查询出了数据
    ⑵在数据显示方面,我们只是定义了一个URL,但是可以通过查询字符串的方式来访问第二页的数据
    ⑶可以看出:有很多东西都是Django封装好了的,我们只需要按照我们的需要来传入对应的属性(方法)值就可以了
    ⑷模板在ListView类视图中是没有封装的,这个是完全需要我们自己来写的:相当于就是Django已经给你封装好了数据分页的视图了,我们要做的就是定义好传递给模板的参数以及模板

2、上面例子只是一个很简单的ListView类视图,主要是先熟悉下这个类视图里面有哪些东西

3、这个例子中:翻页功能我们是通过手动在地址栏中输入URL实现的。实际中应该是有个翻页按钮之类的,通过这个翻页按钮来向后端传递这个查询字符串参数值的

4、这个例子中:数据库中一共有四条数据,每页显示2条,那么总共有2页。我们如果让page=3的话,就会找不到页面。如果我们在网址后面没有传递page参数,默认返回的就是第一页。

 

 

ListView类视图属性、方法

属性、方法名 描述
model   重写model类属性,指定这个列表是给哪个模型的
template_name 指定这个列表的模板
paginate_by 指定这个列表一页中展示多少条数据
context_object_name  指定这个列表模型在模板中的参数名称(传递到模板的参数名)
ordering 指定这个列表的排序方式
page_kwarg   获取第几页的数据的参数名称。默认是page
get_context_data 获取上下文的数据
get_queryset 根据需要来查询数据,默认是全部数据(all方法)

            
page_kwarg属性

1、page_kwarg属性值用来来修改查询字符串参数的参数名

2、这些属性可以理解为Python中的类属性:整个类公用的属性

例2:修改URL中页数参数名
⑴编辑视图

高级视图_ListView类视图

⑵访问第一页

高级视图_ListView类视图

⑶访问第二页

高级视图_ListView类视图

注:
1、可以通过"page_kwarg"属性值来修改查询字符串参数的参数名

2、URL中的查询字符串参数是不会影响的URL匹配的:查询字符串参数只是用于视图函数获取参数的(根据参数来返回对应的内容)
    ⑴即使访问的URL中的查询字符串参数的参数名错误了,还是可以正常访问的,只是说访问的内容可能不是正确的
    ⑵比如,这个例子中访问第二页时,正确的URL是:http://127.0.0.1:8000/zh/index/?p=2,但是我们实际访问的是http://127.0.0.1:8000/zh/index/?page=2
    ⑶由于http://127.0.0.1:8000/zh/index/是正确的,可以正常访问(访问的额第一页),由于查询字符串参数名错了,视图函数中不能获取到对应的值。因此不管其值时多少,实际*问的都是第一页
    


get_context_data方法

1、get_context_data方法用来:获取上下文的数据,并且可以添加自己的参数

2、前面的例子中我们直接是将从数据库中查询出来的数据,传递给了模板,这些数据我们也不知道具体是什么样子的
    ⑴因此可以使用get_context_data方法来打印这些数据(打印从数据库中查询到的数据,以及其他一些信息)
    ⑵并且也可以使用该方法来额外添加某些参数值

例3:获取上下文
⑴编辑视图

高级视图_ListView类视图

注:
输出结果里面包含了很多东西,有我们常用的paginator类、page_obj类和我们自定义的一些参数等。paginator类、page_obj类下面将会进行讲解

 

get_queryset方法

get_queryset:如果你提取数据的时候,并不是要把所有数据都返回,那么你可以重写这个方法。将一些不需要展示的数据给过滤掉

例4:
⑴编辑视图

高级视图_ListView类视图

⑵访问

高级视图_ListView类视图

注:
需要记住:这些Django内置的类视图只是帮你封装好了如何实现一些功能(视图),至于向前端传递哪些数据、数据如何在前端进行展示都是需要我们自己去定义的

 

 

Paginator和Page类

Django提供了数据分页的类,这些类被定义在django/core/paginator.py中
    ⑴对象Paginator用于对列进行一页n条数据的分页运算
    ⑵对象Page用于表示第m页的数据

 

aginator类对象的属性

属性名 说明
num_pages 返回分页之后的总页数
page_range 返回分页后页码的列表

 

Paginator类对象的方法

方法名 说明
page(self, number)  返回第number页的Page类实例对象

    
Page类对象的属性

属性名 说明
number 返回当前页的页码
object_list 返回包含当前页的数据的查询集
paginator  返回对应的Paginator类对象


Page类对象的方法

方法名 说明
has_previous 判断当前页是否有前一页
has_next   判断当前页是否有下一页
previous_page_number 返回前一页的页码
next_page_number 返回下一页的页码