Django ListView 获取 URL 参数与分类关键字分页查询实现

南乔
南乔
发布时间:2026-10-13 | 4人浏览过
原创

本文详解如何在 Django 的 ListView 中获取 URL 查询参数,并实现分类与关键字的组合查询逻辑。涵盖纯分类、纯关键字及混合查询三种场景,结合前端 JS 事件绑定与后端视图处理,演示如何保持分页状态下的参数传递,确保用户点击分页时分类与搜索条件不丢失。

Django ListView 基础配置与 URL 参数获取

在 Django 项目中,我们通常使用 ListView 来展示列表数据。首先定义视图类,继承自 ListView 或 DetailView。通过设置 context_object_name 指定模板中使用的对象列表变量名,若未指定则默认为 object_list。同时指定 template_name 指向对应的 HTML 模板文件路径。


from django.views.generic import ListView,DetailView
from xxxx.models import Model_Name
class Colortag_view(ListView):
 #context_object_name = '如果不指定的话在html页面中 可以使用object_list获取' 
 context_object_name = 'object_list'
 #template_name='html页面所在目录'
 template_name='caradmin/colortags/colortags.html'
 #自定义查询方法
 def get_queryset(self):
  #获取url 中的值 比如http://127.0.0.1/admin/colortags/?name_text=红色
  print(self.request.GET.dict())
  return Model_Name.objects.filter(**self.request.GET.dict())

在 urls.py 中配置路由,将特定的 URL 路径映射到视图类的 as_view() 方法,并命名该 URL 模式,以便在模板中通过 url 标签引用。


from . import views
urlpatterns = [
 path('colortags/', views.Colortag_view.as_view(), name = 'modelname_list'),
]

分类与关键字查询场景分析

补充知识:Django 分类查询和关键字查询以及查询后的分页

实现思路:分类和关键字查询主要涉及以下几种情况:

1、仅按照分类进行查询。

2、仅按照关键字进行查询。

3、同时按照分类和关键字进行联合查询。

仅按分类查询的实现

第一种情况:仅按照分类查询。

我们在前端编写了一个 select 下拉菜单用于选择分类。当用户选中某个分类选项时,页面应跳转到展示该分类下商品的列表页。


<!-- 点击类别跳转到则展示相应的分类 -->
 $("#p_type").change(function(){
 var type = $(this).val()
 location.href = '/backweb/good_list/?type='+type
 })

通过原生 JavaScript 的 onchange 事件或 jQuery 的 change 方法,为 select 标签绑定事件监听器。在事件处理函数中,通过 $(this) 获取当前被选中的选项元素,并提取其值。

将获取到的分类值作为 URL 查询参数(即 ? 后的参数)传递给视图。在视图函数中,首先根据传递的分类参数对数据库数据进行筛选,然后将筛选后的数据传递给前端页面进行渲染展示。

如果页面还实现了分页功能,则需要将后端处理数据时使用的分类值一并传递到前端。当用户点击分页链接跳转时,在 URL 的查询参数中再次携带分类值,以便后端能根据新的页码和分类条件继续处理数据。

仅按关键字查询的实现

第二种情况:仅按照关键字查询。

逻辑与分类查询类似。首先为文本输入框(如 type 为 text 的 input 标签)绑定事件,获取用户输入的关键字值。将该值作为 URL 查询参数传递给后端。后端根据该参数对数据进行模糊匹配(使用 contains 过滤器)筛选,随后将筛选后的商品列表及查询参数返回给前端进行展示。

当用户点击分页链接时,需将当前的查询关键字作为参数传递回后端,以确保翻页后仍保持相同的搜索条件。

分类与关键字联合查询及分页处理

第三种情况:同时按照分类和关键字进行查询。

此时需要在 URL 的查询参数中传递两个值:一个是分类 ID,另一个是关键字。后端接收这两个参数后,先按分类筛选,再在分类结果中按关键字进行模糊查询。


<!-- 关键字查询 -->
function select_goods(){
 var context=$('#context').val()
 var type = $('.select').val()
 
 if (context){
  location.href = '/backweb/good_list/?type='+type+'&context='+context
 }else{
  location.href = '/backweb/good_list/?type='+type
 }
 
 
}

分页跳转地址的代码示例如下:

<a href="{% url 'backweb:good_list' %}?type={{ type_id }}&context={{ context }}&page=1" rel="external nofollow" >第一页</a>

视图处理代码逻辑如下:


def good_list(request):
 if request.method == 'GET':
  page_num = int(request.GET.get('page', 1))
  type = request.GET.get('type',0)
  context = request.GET.get('context','')
  # 如果拿不到分类则将type_id设置为0
  if not type:
   type_id = int(type)
  else:
   type_id = int(type)
  # 所有的分类
  type_list = FoodType.objects.all()
  # 根据相应的分类查找相应的商品
  # 如果type_id不为0则获取相应分类的商品
  if not type_id:
   goods = Goods.objects.all()
  else:
   goods = Goods.objects.filter(goods_type_id=type_id)
 
  # 如果有搜索条件则按照搜索条件模糊查询
  if context:
   goods = Goods.objects.filter(goods_type_id=type_id,productname__contains=context)
   if not goods:
    goods = Goods.objects.filter(goods_type_id=type_id,productname__contains=context[-1])

以上关于 Django ListView 获取 URL 参数及分类关键字分页查询的内容分享完毕,希望能为读者提供参考。如有更多疑问,欢迎支持相关技术社区。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表