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?
Ich schlage vor, https://www.youtube.com/watch?v=EiOglTERPEo –
Oder lesen Sie [super super angesehen] (https://rhettinger.wordpress.com/2011/05/26/super-consided- Super/). –
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