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

如何让Django formset仅在克隆新增的表单上添加删除按钮

解决方案

前置调整

首先修改你的表单模板,默认渲染的首个.dynamic-form元素不要包含删除按钮代码,保证首屏加载的默认表单没有删除入口,从根源避免误删。

核心代码修改

  1. 首先修复updateElementIndex方法里的正则表达式转义问题,原代码的\d未正确转义会导致匹配失效:
function updateElementIndex(el, prefix, ndx) {
    // 修正\d转义
    var id_regex = new RegExp('(' + prefix + '-\\d+)');
    var replacement = prefix + '-' + ndx;
    if ($(el).attr("for")) $(el).attr("for", $(el).attr("for").replace(id_regex, replacement));
    if (el.id) el.id = el.id.replace(id_regex, replacement);
    if (el.name) el.name = el.name.replace(id_regex, replacement);
}
  1. 修改addForm方法,在克隆生成新表单后,手动插入删除按钮并适配当前表单序号:
function addForm(btn, prefix) {
    var formCount = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val());
    var row = $('.dynamic-form:first').clone(true).get(0);
    $(row).removeAttr('id').insertAfter($('.dynamic-form:last')).children('.hidden').removeClass('hidden');
    $(row).children().not(':last').children().each(function() {
        updateElementIndex(this, prefix, formCount);
        $(this).val('');
    });
    // 新增:给克隆的表单插入删除按钮
    const deleteBtn = `
    <a id="remove-${prefix}-${formCount}-row" href="javascript:void(0)" class="delete-row">
        Delete <em class="icon ni ni-trash-fill text-danger fs-15px"></em>
    </a>`;
    // 此处可根据你的页面结构调整插入位置,比如插入到表单的操作列容器中,示例为直接插入到表单行末尾
    $(row).append(deleteBtn);
    // 绑定删除事件
    $(row).find('.delete-row').click(function() {
        deleteForm(this, prefix);
    });
    $('#id_' + prefix + '-TOTAL_FORMS').val(formCount + 1);
    return false;
}

其他说明

原初始化代码中$('.delete-row').click的绑定逻辑不需要修改,因为默认表单没有delete-row类的元素,不会触发绑定逻辑,不会产生多余影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:42:01