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

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 %}标签,这会引发模板渲染异常,必须补充完整。

额外优化建议

  1. 合并路由规则:将两个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参数,都能正确匹配到视图。

  1. 分页跳转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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:35:03