2010-12-11 76 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 

的問題來自於widget.attrs mceEditor的[「類」。我的想法是猴子修補博客對象

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

我的問題是我的Python的技能在內容領域都沒有達到與調用super拉姆達更換綁定的方法的任務。

當管理員想要創建一個顯示在管理頁面上的字段時,formfield被調用,所以我需要修補它以使BlogPost窗口小部件對象不具有mceEditor類(我試圖離開mceEditor在所有其他的東西)

你如何製作替代功能?我敢肯定,我

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

回答

1

重視它你可以在管理的方法formfield_for_dbfield改變使用formfield:

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

那麼,這兩種方式有幾個MODS的工作: '如果field.name == '內容':' 應該 '如果db_field。 name =='content':' 和'instancemethod'至少需要2個參數(第二個參數是字段)。如果你能解決這兩件事,我會接受它作爲答案。 感謝您的幫助。 – boatcoder 2010-12-11 03:44:11

+0

修復了它......如果您想了解更多有關覆蓋python實例方法的信息:http://irrepupavel.com/documents/python/instancemethod/ – 2010-12-11 13:07:57

相關問題