2010-12-11 34 views
0

既存のDjango Mezzanine設定を修正して、Markdownでブログできるようにしています。メザニンはそうのように定義されるHtmlFieldとしてコンテンツを有する「コア」モデルを有する:Djangoモデルフィールドでこのメソッドをオーバーライドするには

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 

問題がmceEditorのwidget.attrs [「クラス」]から来ます。私の考えは

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

Blogオブジェクト上のコンテンツ]フィールドにパッチを適用サルにいた私の問題は私のpythonのスキルですsuperを呼び出し、ラムダとバインドされたメソッドを置き換えるのタスクまでではありません。

フォームフィールドは、管理ページに表示するフィールドを作成するときに呼び出されるので、BlogPostウィジェットオブジェクトにmceEditorのクラスを持たないようにパッチを適用する必要があります(mceEditor他のすべてについて)

交換機能をどのように工夫していますか?私はあなたが管理者の方法formfield_for_dbfieldで使用されるフォームフィールドを変更することができ

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

答えて

1

でそれを添付してかなり確信している:

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) 
+0

まあが、両方の方法は、いくつかの改造で動作します。 name == 'content': ' そして' instancemethod'は少なくとも2つの引数(2つ目はフィールド)をとります。あなたがそれらの2つのことを解決できるなら、私はそれを答えとして受け入れます。 ありがとうございます。 – boatcoder

+0

修正済み... pythonでインスタンスメソッドを上書きする方法について詳しくは、http://irrepupavel.com/documents/python/instancemethod/ –

1

私はこの質問は数ヶ月前に答えた実感が、念のために誰がそれを越えてくる、メザニンは現在、完全に機能を提供しますWYSIWYGエディタフィールドを変更します。ここではそれについてのドキュメントを見てください: `field.name場合== 'コンテンツ':` は `db_field場合でなければなりません

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

+0

ありがとうございました。私はハックを元に戻すことができます – boatcoder

関連する問題