Django ListView 核心用法详解:从基础列表到高级过滤与分页
本文深入解析 Django 中 ListView 视图类的核心用法。涵盖从基础数据展示到高级功能的完整实践,包括通过重写 get_queryset 实现基于 Q 对象的复杂过滤、利用 get_context_data 传递多组数据至模板、限制 HTTP 请求方法,以及配置 paginate_by 实现前端分页展示。适合希望优化 Django 后端列表逻辑的开发者参考。
环境配置与基础场景
开发环境配置如下:
- Python 3.6
- Django 1.11
ListView 核心用法详解
场景一:基础数据列表展示
在实际开发中,常需从数据库获取一批数据并在前端以列表形式呈现,例如获取所有用户信息并在用户列表页展示。
解决方案:传统 ORM 查询方式
常规做法是通过 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 函数来实现复杂查询条件。
场景三:多上下文数据返回
若需向模板返回多个数据对象(除 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}。
场景四:限制请求方法
若需限制接口的 HTTP 请求方式(例如仅允许 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'] # 加上这一行,告知允许那种请求方式
场景五:数据分页展示
若一次性返回所有数据给前端,建议采用分页展示以提升性能与体验,配置方法如下:
至此,关于 Django ListView 的详细用法(含分页 paginate)介绍完毕。如需了解更多相关内容,可查阅本站往期文章或继续浏览后续教程,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













