覆盖admin Media类

时间:2010-03-23 22:28:14

标签: django

给定一个设置富文本编辑器的管理媒体类,例如:

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 = ''

想法?谢谢。

2 个答案:

答案 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

史蒂夫

相关问题