TinyMCE在Django表单提交时丢失换行内容:预期<br>标签却变为空<p>标签
标签却变为空
标签
嗨,这个问题我之前做Django项目时也踩过坑!明明在TinyMCE编辑器里看着换行和段落都正常得很,结果一提交表单,保存的内容全变成了空<p>标签,完全不是想要的<br>或者正常段落格式,真的让人头大。我整理了几个大概率能解决问题的排查方向,你可以挨个试试:
检查TinyMCE的初始化配置
这是最容易出问题的地方!TinyMCE 6的换行处理参数和旧版本有差异,如果你想要的是<br>标签而非自动生成的空<p>,得调整这几个关键配置项:tinymce.init({ selector: '#your-editor-element-id', force_br_newlines: true, force_p_newlines: false, forced_root_block: '', // 这个参数很关键,不要强制根元素为<p> // 其他你的原有配置... });要是你还是想保留
<p>标签但不想出现空标签,那要确保forced_root_block: 'p',同时关闭remove_empty_br、remove_empty_p这类会清理空标签的选项。排查Django表单的内容清理逻辑
Django的表单默认会做安全清理,要是你在Form类里给字段加了strip处理,或者自定义了clean_<field>方法时不小心过滤了内容,就可能把换行相关的标签内容弄没。比如别写这种代码:def clean_content(self): content = self.cleaned_data.get('content') return content.strip() # 这会把空<p>标签的内容直接清掉!另外,如果用了
django-tinymce包,要确保Form的Widget配置没有开启过度清理,比如正常配置就好:from django import forms from tinymce.widgets import TinyMCE class YourForm(forms.Form): content = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))检查视图里的请求处理方式
提交表单时,视图里获取POST数据的操作也可能出问题。比如别用request.POST.get('content', '').strip()这种写法,直接用request.POST.get('content', '')就行,strip()会把那些看起来是空的标签内容直接过滤掉,导致最终保存的就是空<p>标签。排查第三方清理工具的规则
要是你项目里用了bleach或者django-cleanup这类内容清理工具,得检查它们的规则是不是误删了<br>或者空<p>里的换行内容。比如bleach的allowed_tags列表里要确保包含<br>和<p>,不然这些标签会被直接过滤掉。
我当时就是TinyMCE的初始化配置没调好,改完forced_root_block那几个参数后,提交的内容就完全符合预期了,你可以先从这个方向入手试试!
备注:内容来源于stack exchange,提问作者Santhosh Kumar

