给定一个设置富文本编辑器的管理媒体类,例如:
class TutorialAdmin(admin.ModelAdmin):
fields...
class Media:
js = ['/paths/to/tinymce.js',]
我希望能够根据它引用的模型中的字段值有选择地覆盖js。我在Tutorial模型中添加了一个“use_editor”布尔值。问题是,如何检测当前实例是否设置了bool?我想最终得到类似的东西:
class Media:
if self.use_editor:
js = ['/path/to/tinymce.js',]
else:
js = ''
想法?谢谢。
答案 0 :(得分:3)
非常感谢Sam Lai对django用户,我终于有了一个有效的解决方案。事实证明比预期更棘手,因为您无法直接从Admin类中访问实例上的字段值 - 您需要通过重新定义Admin类使用的表单来实现。此外,您需要使用_media而不是“类媒体:”来设置媒体属性。
目标是检测use_visual_editor字段的当前实例值,并根据其值打开或关闭javascript路径(因此作者可以基于每个记录关闭可视化编辑器)。这是最终的工作解决方案:
<强> models.py 强>
class Tutorial(models.Model):
use_visual_editor = models.BooleanField()
<强> forms.py 强>
from django import forms
from tutorials.models import Tutorial
class TutorialAdminForm(forms.ModelForm):
class Meta:
model = Tutorial
def _media(self):
if self.instance.use_visual_editor == True:
js = ['/paths/to/javascript',]
else:
js = ['']
return forms.Media(js=js)
media = property(_media)
<强> admin.py 强>
from django import forms
....
class TutorialAdmin(admin.ModelAdmin):
form = TutorialAdminForm
完美无缺!
答案 1 :(得分:1)
在您使用TinyMCE的情况下,另一种方法是使用额外的JS文件,将“mceNoEditor”类添加到您不想转换为富文本的textareas。
例如
class fooAdmin(admin.Modeladmin)
class Media:
js = ['/path/to/admin-styling.js',
'/paths/to/tinymce.js',]
在你的tinymce.js init中,你需要确保为禁用编辑器定义了一个类,例如:
editor_deselector : "mceNoEditor",
并且在admin-styling.js文件中在文档就绪处理程序中有一些jQuery调用,它找到某些元素并在调用TinyMCE之前添加该类。
通常您可以使用'id_foo'标识符执行此操作。例如,如果你有一个名为additional_notes的模型字段:
$('textarea#id_additional_notes').addClass('mceNoEditor');
当然,也可以使用更复杂的jQuery选择器。
HTH
史蒂夫