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

如何将Django inline_formset的jQuery代码转为纯JS实现动态表单添加

解决Django inline_formset动态添加表单的纯JavaScript转换问题

问题核心:jQuery的append()方法会自动将HTML字符串解析为DOM元素后插入,但原生JavaScript的Element.append()如果直接传入字符串,会将其作为纯文本节点插入,导致HTML标签被原样显示。

可行的解决方案

方法1:使用insertAdjacentHTML(推荐)

这个方法可以直接将HTML字符串解析为DOM元素,并插入到指定位置,效果和jQuery的append()完全一致,且不会影响容器内已有的DOM元素和事件绑定:

document.querySelector('#item-images').insertAdjacentHTML('beforeend', compiledTmpl);

方法2:使用innerHTML追加

通过直接拼接容器的innerHTML来添加新表单,实现简单,但如果容器内已有绑定事件的元素,重新渲染会丢失事件绑定:

document.querySelector('#item-images').innerHTML += compiledTmpl;

方法3:手动解析HTML为DOM元素

使用DOMParser将字符串转为DOM片段,适合需要对插入的表单元素做额外操作的场景:

const parser = new DOMParser();
const doc = parser.parseFromString(compiledTmpl, 'text/html');
const newForm = doc.body.firstElementChild;
document.querySelector('#item-images').append(newForm);

修改后的完整代码(以insertAdjacentHTML为例)

const btnAddMoreImg = document.querySelector('#add-image-button');
btnAddMoreImg.addEventListener('click', (evt) => {
    evt.preventDefault();
    let count = document.querySelector('#item-images').children.length;
    let tmplMarkup = document.querySelector('#images-template').innerHTML;
    let compiledTmpl = tmplMarkup.replace(/__prefix__/g, count);
    
    // 替换jQuery append的核心代码
    document.querySelector('#item-images').insertAdjacentHTML('beforeend', compiledTmpl);

    // 更新表单计数
    document.querySelector('#id_images-TOTAL_FORMS').setAttribute('value', count + 1);
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:22:18