

[Django用法] Django的ListView超详细用法(含分页paginate功能)
source link: http://www.bigyoung.cn/posts/73/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

开发环境:
python 3.6 django 1.11
场景一
经常有从数据库中获取一批数据,然后在前端以列表的形式展现,比如:获取到所有的用户,然后在用户列表页面展示。
解决方案
常规写法是,我们通过Django的ORM查询到所有的数据,然后展示出来,代码如下:
def user_list(request): """返回UserProfile中所有的用户""" users = UserProfile.objects.all() return render(request, 'talks/users_list.html', context={"user_list": users})
这样能够解决问题,但是Django针对这种常用场景,提供了一个更快速便捷的方式,那就是 ListView
,用法如下:
from django.views.generic import ListView class UsersView(ListView): model = UserProfile template_name = 'talks/users_list.html' context_object_name = 'user_list'
这样我们就完成了上边功能,代码很简洁。
场景二:
我想要对数据做过滤, ListView
怎么实现?代码如下:
from django.views.generic import ListView class UsersView(ListView): model = UserProfile template_name = 'talks/users_list.html' context_object_name = 'user_list' def get_queryset(self): # 重写get_queryset方法 # 获取所有is_deleted为False的用户,并且以时间倒序返回数据 return UserProfile.objects.filter(is_deleted=False).order_by('-create_time')
如果你要对数据做更多维度的过滤,比如:既要用户是某部门的,还只要获取到性别是男的,这时候,可以使用Django提供的Q函数来实现。
场景三
我想要返回给Template的数据需要多个,不仅仅是 user_list
,可能还有其他数据,如获取当前登陆用户的详细信息,这时怎么操作?,代码如下:
from django.views.generic import ListView class UsersView(ListView): model = UserProfile template_name = 'talks/users_list.html' context_object_name = 'user_list' def get_context_data(self, **kwargs): # 重写get_context_data方法 # 很关键,必须把原方法的结果拿到 context = super().get_context_data(**kwargs) username = self.request.GET.get('user', None) context['user'] = UserProfile.objects.get(username=username return context
这样,你返回给Template页面时,context包含为 {'user_list': user_list, 'user': user}
。
场景四
我想要限制接口的请求方式,比如限制只能GET访问,代码如下:
from django.views.generic import ListView class UsersView(ListView): model = UserProfile template_name = 'talks/users_list.html' context_object_name = 'user_list' http_method_names = ['GET'] # 加上这一行,告知允许那种请求方式
场景五
我卡卡卡的返回了所有的数据给前端页面,前页面最好得分页展示呀,这怎么搞?请看代码:
from django.views.generic import ListView class UsersView(ListView): model = UserProfile template_name = 'talks/users_list.html' context_object_name = 'user_list' paginate_by = 12 # 只需加上这一行,12表示每页内容显示多少个
Template页面怎么用呢?来,上代码:
<center> {% if page_obj %} <div class="pagination"> <span class="step-links"> {% if page_obj.has_previous %} <a class="btn btn-primary" href="?page=1">第一页</a> <a class="btn btn-primary" href="?page={{ page_obj.previous_page_number }}">上一页</a> {% endif %} <a class="btn btn-default"> Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}. </a> {% if page_obj.has_next %} <a class="btn btn-primary" href="?page={{ page_obj.next_page_number }}">下一页</a> <a class="btn btn-primary" href="?page={{ page_obj.paginator.num_pages }}">最后一页</a> {% endif %} </span> </div> {% endif %} </center>
Recommend
-
52
先上图 静态数据 首先创建项目,不多说 图文列表在 Flutter 里有个组件专门渲染图文列表的 ListTile
-
7
How to Paginate Data With PHPby Jason1 day agoDifficulty:IntermediateLength:LongLanguages: I can remember y...
-
10
Tutorial How To Limit and Paginate Query Results in Laravel Eloquent PHP
-
2
Paginate JSON object · GitHub Instantly share code, notes, and snippets. Paginate JSON object va...
-
5
-
7
will_paginate generates an incorrect number of page links advertisements I am Using will paginate 3.0.2 and Rails 3.1.0.
-
9
Nic Lin's Blog喜歡在地上滾的工程師Implement background animation colors for comments(like stack over flow share answer link)Rails version 5.1.3 Ruby version 2....
-
6
一般情况下,我们使用Listview的方式是构建要展示的item,然后将这些item传入ListView的构造函数即可,通常情况下这样做是够用了,但是不排除我们会有一些其他的特殊需求。 今天我们会来讲解一下ListView的一些高级用法。 Li...
-
8
一般情况下,我们使用Listview的方式是构建要展示的item,然后将这些item传入ListView的构造函数即可,通常情况下这样做是够用了,但是不排除我们会有一些其他的特殊需求。 今天我们会来讲解一下ListView的一些高级用法。 ListView的常规用法
-
9
一般情况下,我们使用Listview的方式是构建要展示的item,然后将这些item传入ListView的构造函数即可,通常情况下这样做是够用了,但是不排除我们会有一些其他的特殊需求。 今天...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK