2016-11-14 2 views
0

djangoが選択したjQueryプラグインを使用するための2つのカスタムウィジェットを作成します.1つはForeignKeyモデルフィールド、もう1つはManyToManyFieldです。したがって、それぞれ、私はforms.Selectforms.SelectMultipleを無効にします。 Selectを参照してください。年代とSelectMultiple年代には、それぞれのメソッドをレンダリングする必要があり、スーパーへの呼び出しがあるpythonのsuper()メソッドの解決

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}) 

注:として私は、共通の親クラスで共通の機能を置きます。

そして、私は私のクラスを定義します。

class ChosenWidgetMultiple(widgets.SelectMultiple, ChosenWidgetParent): 
    pass 

class ChosenWidget(widgets.Select, ChosenWidgetParent): 
    pass 

これは、残念ながら動作しませんが、私は親クラスを交換するとき、それは動作します。

class ChosenWidgetMultiple(ChosenWidgetParent, widgets.SelectMultiple): 
    pass 

class ChosenWidget(ChosenWidgetParent, widgets.Select): 
    pass 

誰かが私の理由を説明できますか?

+0

https://www.youtube.com/watch?v=EiOglTERPEo –

+0

をご覧になるか、[super consider super](https://rhettinger.wordpress.com/2011/05/26/super-considered-スーパー/)。 –

+0

ダニエル・ローズマン:私はその記事を見てきましたが、徹底的に読んだことはありませんが、他の記事を読んでいます。このメソッド全体の解決の問題は、今は少し抽象的で複雑に思えます。だから、特定の入力が助けになると思います。ありがとう、 – mehmet

答えて

1

これが方法の解決方法です。 Pythonは宣言された順番でクラスを調べ、見つかった最初のメソッドを呼び出します。最初に元のウィジェットを宣言すると、Pythonはそのレンダリングメソッドを見つけて呼び出します。あなたの実装に進むことは決してありません。しかし、あなたが最初にあなたのものを置くと、Pythonはそれを呼び出し、それがsuper()になると元のものを呼び出します。

+0

スーパーMRは通常のMRのように動作しますが、自己オブジェクトをスキップし、親で始まるように思えます。 – mehmet

+0

私はそれの妥当性についてはわかりません。あなたの問題は 'super'とまったく関係がありませんでしたが、' render'メソッドの元々の解決策がありました。 –

+0

はい、私はそれを得ました。私は同時にあなたが行ったことに気づいていました:)私のレンダーは初めて実行されたことはありません – mehmet

関連する問題