Django模板生成带参URL失败:如何传递SBOM参数至视图?
问题:Django中正确生成带SBOM编号与分页参数的URL
我基于现有MySQL数据库开发Web前端,用Django框架实现SBOM(软件物料清单)选择后加载关联软件并分页浏览的功能,但在URL生成上遇到问题。
现有代码配置
urls.py
urlpatterns = [ path("", views.select_bill, name="select_bill"), path("select_software/<int:bill_num>", views.select_software, name="select_software"), path("select_software/<int:bill_num>/<int:page>", views.select_software, name="select_software") ]
views.py
from django.shortcuts import render from django.core.paginator import Paginator from frontend.models import SoftwareResults RESULTS_PER_PAGE = 25 def select_bill(request): bills = get_bills() # 从MySQL数据库查询SBOM列表的函数 return render(request, "frontend/select_bill.html", {"bills": bills}) def select_software(request, bill_num, page=1): # 后续处理逻辑(已省略) pass
select_bill.html模板
<table> {% for entry in bills %} {% url 'select_software' "{{ entry.Row }}" 1 as entry_select %} <tr><td> <a href="{{ entry_select }}">Submit</a></td><td>{{ entry.Filename }}</td></tr> </table>
问题现象
预期生成/select_software/<bill_num>/1格式的URL,跳转到select_software视图,但实际URL解析后回到select_bill页面,{% url %}标签未生效。尝试过两种方案:
- 直接把
{% url %}标签放入href,渲染出错; - 使用表单,POST方法结果相同,GET方法参数编码在URL但分页跳转失效。
解决方案
问题核心是模板中{% url %}标签的参数传递方式错误,不需要给变量套额外的模板语法或引号,直接传递变量即可。
修正后的模板代码
修改select_bill.html中的URL生成逻辑,同时补充遗漏的循环结束标签:
<table> {% for entry in bills %} {% url 'select_software' entry.Row 1 as entry_select %} <tr><td> <a href="{{ entry_select }}">Submit</a></td><td>{{ entry.Filename }}</td></tr> {% endfor %} </table>
关键说明
{% url %}标签内部直接使用模板变量entry.Row即可,嵌套的{{ }}会让Django把它解析成字符串字面量,而非变量的实际值,导致URL参数错误,无法匹配对应路由。- 原模板遗漏了
{% endfor %}标签,这会引发模板渲染异常,必须补充完整。
额外优化建议
- 合并路由规则:将两个
select_software路由合并,利用可选参数简化配置:
urlpatterns = [ path("", views.select_bill, name="select_bill"), path("select_software/<int:bill_num>/<int:page>/", views.select_software, name="select_software"), path("select_software/<int:bill_num>/", views.select_software, kwargs={"page": 1}, name="select_software"), ]
这样无论是否传递page参数,都能正确匹配到视图。
- 分页跳转URL生成:在
select_software视图的模板中,生成分页链接时同样用{% url %}标签传递参数:
<!-- 上一页链接 --> {% if page_obj.has_previous %} <a href="{% url 'select_software' bill_num page_obj.previous_page_number %}">上一页</a> {% endif %} <!-- 下一页链接 --> {% if page_obj.has_next %} <a href="{% url 'select_software' bill_num page_obj.next_page_number %}">下一页</a> {% endif %}
内容的提问来源于stack exchange,提问作者Jeff D.
相关产品推荐
相关产品推荐

