2010-03-23 61 views
4

鉴于管理员媒体类,设置了丰富的文本编辑器,如:重写管理媒体类

class TutorialAdmin(admin.ModelAdmin): 

    fields... 

    class Media: 
     js = ['/paths/to/tinymce.js',] 

我想有选择地覆盖取决于它所引用的模型字段值JS的能力。我在教程模型中添加了“use_editor”布尔值。问题是,如何检测当前实例是否具有该布尔集?我想最后得到类似的东西:

class Media: 
    if self.use_editor: 
     js = ['/path/to/tinymce.js',] 
    else: 
     js = '' 

想法?谢谢。

回答

3

非常感谢萨姆·赖上Django的用户,我终于对此有一个可行的解决方案。结果是比预期更复杂,因为你不能直接从Admin类中访问实例的字段值 - 你需要通过重新定义Admin类使用的表单来完成。另外,您需要使用_media而不是“class 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

如果您使用的是TinyMCE,另一种方法是使用额外的JS文件,该文件为您不想转换为富文本的textareas添加一个'mceNoEditor'类。

class fooAdmin(admin.Modeladmin) 

    class Media: 
     js = ['/path/to/admin-styling.js', 
       '/paths/to/tinymce.js',] 

在你tinymce.js初始化,您需要确保有如禁用编辑器中定义一个类,:

editor_deselector : "mceNoEditor", 

,并在管理,styling.js文件在文档就绪处理程序中有某种类型的jQuery调用,它可以在调用TinyMCE之前找到某些元素并添加该类。

通常你可以用'id_foo'标识符来做到这一点。例如,如果您有一个名为additional_notes的模型字段:

$('textarea#id_additional_notes').addClass('mceNoEditor'); 

当然,也可以使用更复杂的jQuery选择器。

HTH

史蒂夫

+0

有趣的方法史蒂夫。我不急于在这里做一堆Javascript黑客攻击,尽管我不得不这样做。不禁觉得从模型实例发送一个简单的布尔值并且完成这件事很容易。在django用户上有一个相关的线程。如果有人想出解决方案,会在这里发布。谢谢。 – shacker 2010-03-24 22:32:01