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

如何将JS获取的pk值传入Django表单集行的url模板标签

方案1(更优:模板层直接渲染,无JS依赖)

你最终的实现思路是更合理的方向,Django模板渲染阶段就能拿到当前form对应的实例数据,完全不需要额外用JS处理,也避免了DOM结构变动导致JS取ID失效的问题。
如果要更贴合你最初把inventory_number作为跳转链接的需求,可以优化为更直观的写法,不用依赖字段ID规则判断:

<form method='post' id="data_form">
    {% csrf_token %}
    {{ my_formset.management_form }}
    <table>
      ...
      <tbody>
        {% for form in my_formset %}
          <tr>
            {% for field in form %}
              {% if 'inventory_number' in field.auto_id %}
                <td>
                  <!-- 直接取当前form绑定的实例主键当参数,逻辑更稳定 -->
                  <a href="{% url 'invent:update_item' form.instance.pk %}" class="update-link">
                    {{ field.value }}
                  </a>
                  <!-- 字段不可编辑的话记得加隐藏input提交值,避免表单提交时丢失该字段数据 -->
                  <input type="hidden" name="{{ field.name }}" value="{{ field.value }}">
                </td>
              {% else %}
                <td>{{ field }}</td>
              {% endif %}
            {% endfor %}
          </tr>
        {% endfor %}
      </tbody>
    </table>
  </form>

这个方案不需要修改原有逻辑,也不会受form字段顺序、ID规则变动的影响,稳定性更高。

方案2(需要用JS动态设置链接的处理方式)

Django的{% url %}是服务端渲染阶段就生成的,JS运行在客户端无法直接修改服务端模板变量,你可以先渲染带占位符的URL,再用JS替换占位符:

  1. 模板部分先设置临时占位参数:
<a href="{% url 'invent:update_item' 0 %}" class="update-link">
  {{ field.value }}
</a>

这里传0作为临时参数,生成的URL格式大概为/invent/update/0/,后续JS将0替换为实际ID即可。
2. JS部分修改为:

var links = document.getElementsByClassName('update-link')
for (let i = 0; i < links.length; i++){
  let link_row = links[i].parentNode.parentNode
  let item_id = link_row.lastElementChild.childNodes[1].attributes.value.value
  // 替换占位符为实际ID
  links[i].href = links[i].href.replace('0', item_id)
};

内容的提问来源于stack exchange,提问作者Viktor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:57:03