Django ListView 核心用法详解:从基础列表到高级过滤与分页

桃夭
桃夭
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析 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)介绍完毕。如需了解更多相关内容,可查阅本站往期文章或继续浏览后续教程,感谢支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。