代码之家  ›  专栏  ›  技术社区  ›  shacker kravietz

重写管理媒体类

  •  4
  • shacker kravietz  · 技术社区  · 14 年前

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

    class TutorialAdmin(admin.ModelAdmin):
    
        fields...
    
        class Media:
            js = ['/paths/to/tinymce.js',]
    

    我希望能够根据它引用的模型中的字段值选择性地重写JS。我在教程模型中添加了一个“使用编辑器”布尔值。问题是,如何检测当前实例是否具有该bool集?最后我想说的是:

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

    思想?谢谢。

    2 回复  |  直到 14 年前
        1
  •  3
  •   shacker kravietz    14 年前

    非常感谢Sam Lai对Django用户的关注,我终于有了一个有效的解决方案。结果比预期的要复杂,因为您不能从管理类中直接访问实例上的字段值-您需要通过重新定义管理类使用的表单来完成这项工作。此外,您还需要使用 _media 而不是“类媒体:”来设置媒体属性。

    目标是检测“使用可视化编辑器”字段的当前实例值,并根据其值打开或关闭javascript路径(这样作者可以基于每条记录关闭可视化编辑器)。下面是最终的工作解决方案:

    型号.py

    class Tutorial(models.Model):
        use_visual_editor = models.BooleanField()
    

    表格.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)
    

    行政副总裁

    from django import forms
    ....
    class TutorialAdmin(admin.ModelAdmin):
        form = TutorialAdminForm
    

    工作得很好!

        2
  •  1
  •   Steve Jalim    14 年前

    另一种方法,考虑到您使用的是Tinymce,就是使用一个额外的JS文件,该文件将“McEnoEditor”类添加到您不想转换为富文本的文本区域中。

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

    在tinymce.js init中,需要确保为禁用编辑器定义了一个类,例如:

    editor_deselector : "mceNoEditor", 
    

    在admin-styleing.js文件中,在document ready处理程序中有某种jquery调用,该处理程序查找某些元素,并在调用tinymce之前添加该类。

    通常,您可以使用“id_foo”标识符进行此操作。例如,如果您有一个名为附加注释的模型字段:

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

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

    高温高压

    史蒂夫