如何将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替换占位符:
- 模板部分先设置临时占位参数:
<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
相关产品推荐
相关产品推荐

