Как переопределить этот метод в поле модели Django - PullRequest
0 голосов
/ 11 декабря 2010

Я пытаюсь изменить существующую Django Mezzanine установку, чтобы я мог вести блог в Markdown.У мезонина есть «базовая» модель с содержимым в виде HtmlField, которое определяется следующим образом:

 from django.db.models import TextField


 class HtmlField(TextField):
     """
     TextField that stores HTML.
     """

     def formfield(self, **kwargs):
         """
         Apply the class to the widget that will render the field as a
         TincyMCE Editor.
         """
         formfield = super(HtmlField, self).formfield(**kwargs)
         formfield.widget.attrs["class"] = "mceEditor"
         return formfield

Проблема возникает из widget.attrs ["class"] mceEditor.Мои мысли заключались в том, чтобы обезьяна исправить поле «Содержимое» на объекте «Блог»

class BlogPost(Displayable, Ownable, Content):
    def __init__(self, *args, **kwargs):
        super(BlogPost, self).__init__(*args, **kwargs)
        self._meta.get_field('content').formfield = XXX

Мои проблемы заключаются в том, что мои навыки работы с питоном не сводятся к замене связанного метода лямбда-выражением, которое вызывает super.

formfield вызывается администратором, когда он хочет создать поле для отображения на страницах администратора, поэтому мне нужно исправить это, чтобы объекты виджета BlogPost НЕ имели класс mceEditor (я пытаюсь выйтиmceEditor на все остальное)

Как вы создаете функцию замены?Я почти уверен, что прикрепляю его с

setattr(self._meta.get_field('content'), 'formfield', method_i_dont_know_how_to_write)

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Я понимаю, что на этот вопрос ответили несколько месяцев назад, но на тот случай, если кто-нибудь еще столкнется с ним, Mezzanine теперь предоставляет возможность полностью изменить поле редактора WYSIWYG.Посмотрите документы для этого здесь:

http://mezzanine.jupo.org/docs/admin-customization.html#wysiwyg-editor

1 голос
/ 11 декабря 2010

Вы можете изменить используемое поле формы в методе администратора formfield_for_dbfield:

class BlogAdmin(admin.ModelAdmin):

    def formfield_for_dbfield(self, db_field, **kwargs):
        field = super(BlogAdmin, self).formfield_for_dbfield(db_field, **kwargs)
        if db_field.name == 'content':
            field.widget = ....
            field.widget.attrs['class'] = ...
        return field

Если вы действительно хотите сделать патч для обезьян, это должно быть что-то вроде этого:

class BlogPost(Displayable, Ownable, Content):
    def __init__(self, *args, **kwargs):
        super(BlogPost, self).__init__(*args, **kwargs)
        def formfield_new(self, *args, **kwargs):
            # do here what you would like to do
            return formfield
        instancemethod = type(self._meta.get_field('content').formfield)
        self._meta.get_field('content').formfield = instancemethod(formfield_new,
                                                                   self, BlogPost)
...