
在 Django 模板中,需通过动态拼接查询参数(而非多个独立链接)来实现多条件过滤;推荐使用表单 + method="get",让浏览器自动合并已有参数与新选值。
在 django 模板中,需通过动态拼接查询参数(而非多个独立链接)来实现多条件过滤;推荐使用表单 + `method="get"`,让浏览器自动合并已有参数与新选值。
要支持用户组合多个过滤条件(如 filter1=black 和 filter2=small),不能依赖多个独立 <a> 链接——因为每次点击都会发起全新 GET 请求,覆盖原有参数。正确做法是使用 HTML <form method="get">,它会将所有 <input> 或 <select> 字段的值自动序列化为 URL 查询字符串,并保留当前 URL 中已存在的其他 GET 参数(前提是字段 name 不冲突)。
✅ 推荐实现方式(Django 模板示例):
<!-- 假设当前 URL 是 /products/?filter1=black -->
<form method="get" class="filter-form">
<label>颜色:
<select name="filter1" onchange="this.form.submit()">
<option value="">全部</option>
<option value="black" {% if request.GET.filter1 == 'black' %}selected{% endif %}>黑色</option>
<option value="white" {% if request.GET.filter1 == 'white' %}selected{% endif %}>白色</option>
</select>
</label>
<label>尺寸:
<select name="filter2" onchange="this.form.submit()">
<option value="">全部</option>
<option value="small" {% if request.GET.filter2 == 'small' %}selected{% endif %}>小号</option>
<option value="big" {% if request.GET.filter2 == 'big' %}selected{% endif %}>大号</option>
</select>
</label>
<!-- 可选:显式提交按钮 -->
<button type="submit">应用筛选</button>
</form>? 关键机制说明:
- method="get" 表单提交时,浏览器会将所有非空字段(包括已存在于 URL 中的参数)合并生成新查询字符串,例如从 /products/?filter1=black 提交 filter2=small 后,自动跳转至 /products/?filter1=black&filter2=small;
- 使用 onchange="this.form.submit()" 可实现“选择即生效”,提升交互体验(也可改为点击按钮触发);
- Django 模板中通过 {% if request.GET.xxx %} 动态设置 selected,确保表单状态与当前 URL 参数同步;
- 若需保留其他非过滤类参数(如分页 page=2),可在表单中添加隐藏域:
{% for key, value in request.GET.items %} {% if key != 'filter1' and key != 'filter2' %} <input type="hidden" name="{{ key }}" value="{{ value }}"> {% endif %} {% endfor %}
⚠️ 注意事项:
- 避免在模板中手动拼接 URL(如 ?filter1={{ ... }}&filter2={{ ... }}),易出错且无法优雅处理参数缺失或编码问题;
- 所有用户输入的查询参数应经后端校验(如 request.GET.get('filter1') in ['black', 'white']),防止无效值注入;
- 如需更灵活的前端控制(如异步刷新、URL 更新不跳转),可结合 JavaScript 的 URLSearchParams 和 history.pushState(),但基础场景下原生表单已足够简洁可靠。
综上,语义清晰、兼容性好、无需额外 JS 的 <form method="get"> 是 Django 多参数 GET 过滤的标准实践。


















