Переопределение класса администрирования Media - PullRequest
4 голосов
/ 24 марта 2010

Имеется административный класс мультимедиа, который настраивает текстовый редактор, например:

class TutorialAdmin(admin.ModelAdmin):

    fields...

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

Мне бы хотелось иметь возможность выборочно переопределять js в зависимости от значения поля в модели, на которую оно ссылается. Я добавил логическое значение "use_editor" в модель Tutorial. Вопрос в том, как я могу определить, имеет ли текущий экземпляр этот bool? Я хотел бы закончить что-то вроде:

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

Идеи? Благодарю.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2010

Большое спасибо Сэму Лаю за пользователей django, у меня наконец-то есть рабочее решение для этого. Оказывается, хитрее, чем ожидалось, потому что вы не можете напрямую получить доступ к значениям поля в экземпляре из класса Admin - вам нужно сделать это, переопределив форму, используемую классом Admin. Кроме того, вам нужно будет использовать _media вместо «class Media:» для установки свойства 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 голос
/ 24 марта 2010

Альтернативный подход, учитывая, что вы используете TinyMCE, заключается в использовании дополнительного файла JS, который добавляет класс 'mceNoEditor' к текстовым областям, которые вы не хотите преобразовывать в форматированный текст.

например

class fooAdmin(admin.Modeladmin)

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

В вашем файле tinymce.js вы должны убедиться, что для отключения редактора определен класс, например:

editor_deselector : "mceNoEditor", 

и в файле admin-styling.js есть какой-то вызов jQuery в обработчике готовности документа, который находит определенные элементы и добавляет этот класс до вызова TinyMCE.

Обычно вы можете сделать это с помощью идентификатора id_foo. например, если у вас есть поле модели с именем Additional_notes:

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

Конечно, можно использовать и более сложные селекторы jQuery.

НТН

Steve

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...