2010-12-11 42 views
0

J'essaie de modifier une configuration Django Mezzanine existante pour me permettre de bloguer dans Markdown. Mezzanine a un modèle « Core » qui a un contenu en tant HtmlField qui est défini comme ceci:Comment remplacer cette méthode sur un champ Modèle 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 

Le problème vient des widget.attrs [ « class »] de mceEditor. Mes pensées étaient singe patcher le champ Contenu sur l'objet Blog

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

Mes problèmes sont mes compétences en python ne sont pas à la tâche de remplacer une méthode liée avec un lambda qui appelle super. Formfield est appelé par l'administrateur quand il veut créer un champ pour l'affichage sur les pages d'administration, donc j'ai besoin de patcher cela pour que les objets du widget BlogPost n'aient pas la classe de mceEditor (j'essaie de quitter mceEditor sur toutes les autres choses)

Comment fabriquez-vous la fonction de remplacement? Je suis sûr que je joins avec

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

Répondre

1

Vous pouvez changer le formfield utilisé dans la méthode de l'administrateur 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 

Si vous voulez vraiment faire le singe-patcher, il devrait être quelque chose comme ça:

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

Eh bien, dans les deux sens travailler avec quelques mods: 'si field.name == 'contenu':' doit être 'si db_field. name == 'content': ' et' instancemethod' prend un minimum de 2 arguments (le second étant le champ). Si vous pouvez réparer ces 2 choses, je l'accepterai comme réponse. Merci pour l'aide. – boatcoder

+0

Correction ... Si vous voulez avoir plus d'informations sur l'écrasement des méthodes d'instance en python: http://irrepupavel.com/documents/python/instancemethod/ –

1

Je me rends compte de cette question a été répondu il y a plusieurs mois, mais juste au cas où quelqu'un d'autre vient à travers elle, Mezzanine offre maintenant la possibilité de complètement modifiez le champ de l'éditeur WYSIWYG. Jetez un oeil aux documents pour ici:

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

+0

Merci. Je peux aller défaire mon hack – boatcoder