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

相关问题