2010-12-11 6 views
0

Ich versuche, eine vorhandene Django Mezzanine Einstellung zu ändern, um mir zu erlauben, in Markdown zu bloggen. Mezzanine hat ein „Kern“ Modell, das Inhalt als HtmlField aufweist, die wie so definiert ist:Wie überschreibe ich diese Methode für ein Django-Modellfeld

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 

Das Problem kommt von dem widget.attrs [ „class“] von mceEditor. Meine Gedanken waren an Affen auf dem Blog Objekt

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

Meine Probleme sind meine Python Fähigkeiten sind nicht bis zur Aufgabe des Ersetzens eines gebundenen Methode mit einem Lambda das Feld Inhalt patchen, die super aufruft.

formfield wird vom Administrator aufgerufen, wenn es ein Feld für die Anzeige auf den Admin-Seiten erstellen möchte, also muss ich das patchen, damit die BlogPost-Widgetobjekte nicht die Klasse von mceEditor haben (ich versuche, mceEditor zu verlassen) auf allen anderen Dingen)

Wie fertigt man die Ersatzfunktion? Ich bin mir ziemlich sicher, dass ich hängen Sie es mit

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

Antwort

1

Sie könnten die verwendeten Formularfeld in der Methode des Admin ändern 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 

Wenn Sie wirklich den Affen-Patching tun wollen, sollte es etwas sein, wie folgt aus:

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

Nun, in beide Richtungen arbeiten mit ein paar Mods: 'wenn field.name == 'Inhalt':' sollte 'wenn db_field sein. name == 'content': ' und' instancemethod' benötigt mindestens 2 Argumente (das zweite ist das Feld). Wenn Sie diese 2 Dinge beheben können, werde ich es als Antwort akzeptieren. Danke für die Hilfe. – boatcoder

+0

Es wurde behoben ... Wenn Sie weitere Informationen zum Überschreiben von Instanzmethoden in Python haben möchten: http://irrepupavel.com/documents/python/instancemethod/ –

1

ich weiß, diese Frage wurde vor einigen Monaten beantwortet, aber nur für den Fall, dass jemand anderes kommt über sie, jetzt Mezzanine bietet die Möglichkeit, vollständig zu Ändern Sie das WYSIWYG-Editorfeld. Nehmen Sie ein hier für sie eine die Dokumentation aussehen:

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

+0

Vielen Dank. Ich kann meinen Hack rückgängig machen – boatcoder

Verwandte Themen