2010-03-23 56 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