我没有时间更彻底地研究这个问题,所以我很确定有更好的解决方案,但这似乎对我有用(用django-grappelli 2.3.5和django-tinymce 1.5.1a2 测试。
我假设您正在使用堆叠内联。
您必须覆盖来自 grappelli 的模板,templates/admin/edit_inline/stacked.html
. 在 for 循环迭代中inline_admin_formset|formsetsort:sortable_field_name
,在嵌套的 for 循环迭代之后inline_admin_form
,添加以下代码段:
{% if forloop.last %}
<script type="text/javascript">
if (tinyMCE != undefined) {
django.jQuery('textarea', '.empty-form').each(function() {
tinyMCE.execCommand('mceRemoveControl', false, django.jQuery(this).attr('id'));
});
}
</script>
{% endif %}
它应该禁用对隐藏的“空表单”中的 textarea 元素的 tinyMCE 控件,由为 tinyMCE 小部件呈现的内联 javascript 初始化。
在原始 grappelli 模板的第 133 行附近的某处,您会看到调用grp_inline()
. 添加/修改参数:
$("#{{ inline_admin_formset.formset.prefix }}-group").grp_inline({
prefix: "{{ inline_admin_formset.formset.prefix }}",
onBeforeRemoved: function(f) {
if (tinyMCE != undefined) {
// make sure tinyMCE instances in empty-form are inactive
django.jQuery('textarea', '.empty-form').each(function() {
tinyMCE.execCommand('mceRemoveControl', false, django.jQuery(this).attr('id'));
});
}
},
[...]
onAfterAdded: function(form) {
if (tinyMCE != undefined) {
// re-initialise tinyMCE instances
$('textarea', form).each(function(k,v) {
var tid = $(this).attr('id');
tinyMCE.execCommand('mceRemoveControl', false, tid);
tinyMCE.execCommand('mceAddControl', false, tid);
});
// make sure tinyMCE instances in empty-form are inactive
django.jQuery('textarea', '.empty-form').each(function() {
tinyMCE.execCommand('mceRemoveControl', false, django.jQuery(this).attr('id'));
});
}
[...]
}
[...]
如果您使用可排序,您还希望禁用被拖动的内联文本区域上的 tinyMCE 控件。寻找sortable()
初始化,并修改“开始”回调:
start: function(evt, ui) {
ui.placeholder.height(ui.item.height() + 12);
if (tinyMCE != undefined) {
// make sure tinyMCE instances in empty-form are inactive
$('textarea', ui.item).each(function(k,v) {
var tid = $(this).attr('id');
tinyMCE.execCommand('mceRemoveControl', false, tid);
});
}
},
[...]
这应该给出一个粗略的想法如何解决这个讨厌的问题......