Django ListView 获取 URL 参数与分类关键字分页查询实现
本文详解如何在 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 参数及分类关键字分页查询的内容分享完毕,希望能为读者提供参考。如有更多疑问,欢迎支持相关技术社区。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













