如何在Django模板中为GET请求添加多个筛选参数?
Django实现多条件组合GET筛选(模板优先方案)
核心思路
要实现多筛选条件的组合,核心是保留当前已有的GET参数,仅修改或添加目标筛选参数,避免每次点击都清空之前的筛选条件。Django的request.GET是一个QueryDict对象,处理时需要先复制为可变对象再操作。
方案1:纯Django模板语言实现
直接在模板中利用request.GET的方法生成带组合参数的URL:
filter1筛选链接示例
{% with current_params=request.GET.copy %} {# 替换filter1参数值,保留其他已有参数 #} {% current_params.set "filter1" "black" %} <a href="?{{ current_params.urlencode }}">Black</a> {% endwith %} {% with current_params=request.GET.copy %} {% current_params.set "filter1" "white" %} <a href="?{{ current_params.urlencode }}">White</a> {% endwith %}
filter2筛选链接示例
{% with current_params=request.GET.copy %} {% current_params.set "filter2" "small" %} <a href="?{{ current_params.urlencode }}">Small</a> {% endwith %} {% with current_params=request.GET.copy %} {% current_params.set "filter2" "big" %} <a href="?{{ current_params.urlencode }}">Big</a> {% endwith %}
request.GET.copy():将不可变的QueryDict复制为可变对象,避免直接修改原对象报错。set方法:替换指定参数的取值(参数已存在则覆盖,不存在则新增)。urlencode():将参数字典编码为URL查询字符串格式。
方案2:自定义模板标签(更简洁)
如果需要频繁生成这类筛选链接,自定义模板标签可以大幅简化代码:
- 在你的Django app下创建
templatetags/filters.py文件,内容如下:
from django import template register = template.Library() @register.simple_tag(takes_context=True) def update_filter(context, param_key, param_value): # 从上下文获取request对象 request = context["request"] # 复制当前GET参数 params = request.GET.copy() # 更新或添加目标参数 params[param_key] = param_value # 返回编码后的查询字符串 return params.urlencode()
- 在模板中加载并使用标签:
{% load filters %} {# filter1筛选链接 #} <a href="?{% update_filter 'filter1' 'black' %}">Black</a> <a href="?{% update_filter 'filter1' 'white' %}">White</a> {# filter2筛选链接 #} <a href="?{% update_filter 'filter2' 'small' %}">Small</a> <a href="?{% update_filter 'filter2' 'big' %}">Big</a>
可选优化:支持移除筛选条件
如果需要实现“点击已选中的筛选值,移除该条件”的功能,可添加判断逻辑:
{% with current_params=request.GET.copy %} {% if current_params.get("filter1") == "black" %} {# 当前已选中black,点击后移除该参数 #} {% current_params.pop "filter1" %} <a href="?{{ current_params.urlencode }}">Black (取消)</a> {% else %} {# 未选中,添加/替换参数 #} {% current_params.set "filter1" "black" %} <a href="?{{ current_params.urlencode }}">Black</a> {% endif %} {% endwith %}
内容的提问来源于stack exchange,提问作者heressy
相关产品推荐
相关产品推荐

