2016-11-14 4 views
0

Ich erstelle zwei benutzerdefinierte Widgets für Django das ausgewählte jQuery-Plugin zu verwenden, eine für ForeignKey Modellfelder und die anderen ManyToManyField. Also übersetze ich jeweils forms.Select und forms.SelectMultiple. Ich habe die gemeinsame Funktionalität in einem gemeinsamen Elternklasse wie:super() Methodenauflösung in Python

class ChosenWidgetParent(object): 
    class Media: 
     css = { 
      'all': (
       'sub/staticfull/css/plugins/chosen/chosen.css', 
      ) 
     } 
     js = (
      'sub/staticfull/js/jquery-2.1.1.js', 
      'sub/staticfull/js/plugins/chosen/chosen.jquery.js', 
     ) 
    def render(self, name, value, attrs=None, **kwargs): 
     attrs['chosen'] = 'chosen' 
     rendered = super().render(name, value, attrs, **kwargs) 
     return rendered + mark_safe(u''' 
      <script> 
       $(document).ready(function() { 
        $('#id_%(name)s').chosen({ 
         disable_search_threshold: 10, 
        }) 
       }) 
      </script>''' % {'name': name}) 

Hinweis gibt einen Aufruf von super ist, die Select ‚s und SelectMultiple‘ s bzw. Methoden machen beziehen.

Und dann definiere ich meine Klassen:

class ChosenWidgetMultiple(widgets.SelectMultiple, ChosenWidgetParent): 
    pass 

class ChosenWidget(widgets.Select, ChosenWidgetParent): 
    pass 

Diese leider nicht funktioniert, aber wenn ich die übergeordneten Klassen tauschen, es funktioniert.

class ChosenWidgetMultiple(ChosenWidgetParent, widgets.SelectMultiple): 
    pass 

class ChosenWidget(ChosenWidgetParent, widgets.Select): 
    pass 

Kann mir jemand erklären warum?

+0

Ich schlage vor, https://www.youtube.com/watch?v=EiOglTERPEo –

+0

Oder lesen Sie [super super angesehen] (https://rhettinger.wordpress.com/2011/05/26/super-consided- Super/). –

+0

Daniel Roseman: Ich habe diesen Artikel gesehen, habe ihn nicht gründlich gelesen, habe aber einige andere gelesen. Dieses ganze Problem der Methodenauflösung scheint momentan etwas abstrakt und kompliziert zu sein. Also, ich denke, eine bestimmte Eingabe könnte helfen. Danke, – mehmet

Antwort

1

Weil so die Methodenauflösung funktioniert. Python durchläuft die Klassen in der angegebenen Reihenfolge und ruft die erste gefundene Methode auf. Wenn Sie das ursprüngliche Widget zuerst deklarieren, findet Python seine Rendermethode und ruft sie auf; Es wird nie mit Ihrer Implementierung fortfahren. Aber wenn Sie Ihre zuerst setzen, ruft Python das, und wenn es dann zu super() kommt, ruft das Original auf.

+0

so super MR Arbeit wie normale MR aber scheint wie überspringen das Selbst Objekt und beginnend bei den Eltern – mehmet

+0

Ich bin mir nicht sicher über die Relevanz davon. Dein Problem hat mit "super" überhaupt nichts zu tun, sondern mit der ursprünglichen Auflösung der 'render' Methode. –

+0

ja, ich habe es, ich wollte gleich notieren, dass du es gleichzeitig getan hast :) mein render wurde nie zum ersten mal ausgeführt – mehmet