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

Django动态生成模态框时{% csrf_token %}渲染为字符串的解决方法

解决Django动态模态框中CSRF Token不渲染的问题

因为Django的模板标签是在服务器端渲染页面时解析的,动态通过JS添加的模板标签只会被当作字符串处理,所以得换几种方式来嵌入CSRF token:

方法一:提前存储CSRF Token,动态生成输入框

在页面的静态HTML部分(比如<body>开头)添加一个隐藏的存储token的元素:

<input type="hidden" id="global-csrf-token" value="{{ csrf_token }}">

然后在你的JS函数里,手动构建CSRF的隐藏输入框并插入到表单中:

// 获取提前存储的token
const csrfToken = document.getElementById('global-csrf-token').value;
// 构建表单HTML时加入token输入框
let formHtml = `
  <form id="dynamic-form" method="post">
    <!-- 其他表单字段 -->
    <input type="hidden" name="csrfmiddlewaretoken" value="${csrfToken}">
    <button type="submit">提交</button>
  </form>
`;
// 将formHtml插入模态框
document.getElementById('modal-content').innerHTML = formHtml;

方法二:提前渲染CSRF Token模板,动态复用

在页面里添加一个隐藏的模板容器,提前让Django渲染好CSRF token的HTML:

<div id="csrf-template" style="display: none;">
  {% csrf_token %}
</div>

之后在JS里直接获取这个模板的内容,插入到动态表单中:

// 获取已渲染好的CSRF HTML片段
const csrfHtml = document.getElementById('csrf-template').innerHTML;
// 构建表单时拼接进去
let formHtml = `
  <form id="dynamic-form" method="post">
    <!-- 其他表单字段 -->
    ${csrfHtml}
    <button type="submit">提交</button>
  </form>
`;
// 插入模态框
document.getElementById('modal-content').innerHTML = formHtml;

方法三:如果用AJAX提交表单

如果你的表单是通过AJAX提交的,可以不用在表单里加隐藏输入框,而是直接在请求头里带上CSRF token:

const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
// 提交AJAX请求时设置请求头
fetch('/your-submit-url/', {
  method: 'POST',
  headers: {
    'X-CSRFToken': csrfToken,
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  body: new FormData(document.getElementById('dynamic-form'))
});

这几种方法都能避开动态渲染模板标签的问题,根据你的实际场景选就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:20:12