Django项目中CKEditor setData()显示原始HTML,如何转为富文本?
看起来你现在的问题是调用setData()时传入的是转义后的HTML字符串(比如带<、>这类实体),导致CKEditor显示的是原始标签文本而不是渲染后的富文本。我来给你拆解下解决方法:
1. 先修正模板渲染的问题
你当前的代码是:
CKEDITOR.instances.editor1.setData( "<%- data.description %>" );
这里的<和>把模板标签<%- %>也转义了,导致模板引擎根本没解析data.description,直接把字符串"<%- data.description %>"传给了CKEditor。
如果你的前端用的是EJS/Underscore这类支持<%- %>(不转义输出)的模板引擎,正确的写法应该是直接让模板输出原始的data.description内容:
CKEDITOR.instances.editor1.setData( '<%- data.description %>' );
用单引号包裹模板标签,这样<%- %>会直接输出data.description里的原始HTML,而不是转义后的实体,CKEditor拿到正常的HTML后就会自动渲染成富文本。
如果是Django模板(因为你提到是Django项目),那应该用safe过滤器来避免Django自动转义HTML:
CKEDITOR.instances.editor1.setData( '{{ data.description|safe }}' );
2. 如果内容本身已经被转义了,需要先解码
如果你的data.description在后端存储的时候就已经是转义后的HTML(比如存的是<p>xxx</p>而不是<p>xxx</p>),那光靠模板渲染还不够,需要在前端先把HTML实体解码成原始HTML。可以写一个简单的解码函数:
function decodeHtml(str) { const textarea = document.createElement('textarea'); textarea.innerHTML = str; return textarea.value; }
然后这样调用:
// 先解码模板输出的转义内容,再传给setData const decodedHtml = decodeHtml('<%= data.description %>'); // 注意这里用<%= %>因为内容已经转义了 CKEDITOR.instances.editor1.setData(decodedHtml);
3. 确保CKEditor允许解析这些HTML标签
最后还要检查下CKEditor的配置,默认情况下它会过滤一些HTML标签。如果你的内容里有自定义标签或者特殊格式,需要把allowedContent设为true(允许所有内容),或者配置具体允许的标签:
CKEDITOR.replace('editor1', { allowedContent: true, // 其他配置... });
这样调整后,调用setData()时传入的HTML就能被CKEditor正确渲染成富文本了。
内容的提问来源于stack exchange,提问作者Sai Avinash Duddupudi

