You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:自定义模板标签(更简洁)

如果需要频繁生成这类筛选链接,自定义模板标签可以大幅简化代码:

  1. 在你的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()
  1. 在模板中加载并使用标签:
{% 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:41:09