Django、TinyMCE 字段序列化不一致

Posted

技术标签:

【中文标题】Django、TinyMCE 字段序列化不一致【英文标题】:Django, TinyMCE field serialization inconsistencies 【发布时间】:2018-03-14 21:19:04 【问题描述】:

在 Django 中,我有一个表单。 有一个表单域附加了 TinyMCE 编辑器。

我想检查表单是否已更改,如果已更改,则应显示弹出模式。 我通过在每个页面加载时运行的这段代码来实现这一点:

$($('my-form').each(function() 
    $(this).data('init') = $(this).serialize();
)
$(window).bind('beforeunload', custom_validator);
);

当然,custom_validator 函数也在同一个文件中:

function custom_validator() 
    $('my-form').each(function() 
        if ($(this).data('init') != $(this).serialize()) 
            return "Form has unsaved changes.";
        
    )

当页面加载时,数据('init') 也会使用 TinyMCE 字段进行序列化。如果 TinyMCE 字段包含多行,serialize() 用 '%0D%0A' 表示它们。这很好。 如果我想离开页面或者只是在更改表单后重新加载它,'beforeunload' 事件会触发 custom_validator 函数并阻止我这样做,这也很好。

现在,当我加载页面并且我没有对表单进行任何更改而只想离开页面时,问题就开始了,弹出窗口出现并警告我表单上有更改,即使我没有不要改变任何东西。

事实证明,如果我在 TinyMCE 字段上有多行,当页面加载时,data('init') 包含 '%0D%0A' 字符,但是当我在 'custom_validator' 函数中对表单进行序列化时不包括那些字符。 提交表单也没有任何问题。

任何想法为什么两个序列化器返回不同的序列化字符串?如果表单没有被触摸,应该是一样的。

【问题讨论】:

【参考方案1】:

问题是 jQuery 没有正确序列化 TinyMCE 编辑器的内容。

对于这些分离的事件,即“load”和“beforeunload”,jQuery 的序列化方法返回不同内容的原因对我来说仍然是个谜。但基本上行为是 jQuery 的 serialize 方法被表单的输入字段的内容和附加的 TinyMCE 编辑器弄糊涂了。

像“TEXTAREA”字段的内容与附加的 TinyMCE 编辑器不同,“SPAN”元素的内联 TinyMCE 编辑器内容也可以有不同的内容。

我通过扩展 custom_validator 和匿名函数解决了这个问题,使其分别收集所有非 TinyMCE 字段和 TinyMCE 编辑器内容,分别序列化和比较它们。

这样我就可以避免烦人的浏览器模式弹出窗口的出现。

【讨论】:

以上是关于Django、TinyMCE 字段序列化不一致的主要内容,如果未能解决你的问题,请参考以下文章

datatable 解决字段不一致的情况

Django Admin ForeignKey字段小部件选项和不一致的默认值

序列化后 Django db 字段不显示修改后的 slug 字段值

如何在不使用视图集的情况下序列化 Django 中的注释字段?

Django:在管理界面中使用 TinyMCE 4

Django REST Framework 序列化程序字段必需=false