2016-06-15 22 views
0

ジャンゴ1.9.7UpdateViewとCREATEVIEWを共有し、共通のJavaScript関数

更新と作成は、多かれ少なかれ同様の操作です。ウィジェットattrsとしてJavaScriptイベントを追加したい場合もあります。たとえば、ユーザーは性別を選択します。それに応じて、私は乙女の名前を表示したり隠したりしたいと思います。これは、UpdateViewとCreateViewに共通の操作の単なる例です。

私はミックスインとしてそれを整理しようとしましたが、失敗しました:UpdateViewとCREATEVIEWの両方がFormMixinを使用しています。私がFormMixinから継承している別のミックスインを編成すると、私は衝突を起こします。

あなたは私のコードを繰り返すことなく対処する方法を理解する助けてもらえますか?

class PersonUpdateView(UpdateView): 
    model = Person 
    fields = ['gender', 'last_name'] 

class PersonCreate(CreateView): 
    model = Person 
    fields = ['gender', 'last_name'] 
    redirect_name = "people" 

    field_attrs = {'gender': {'onchange':"alert('G')"}, 
        'last_name': {'onclick': "alert('LN')"}, 
        }  

    def get_form(self, form_class=None): 
     form = super(PersonCreate, self).get_form(form_class) 
     for key, value in self.field_attrs.items(): 
      form.fields[key].widget.attrs = value; 
     return form 

答えて

0

あなたのミックスインは単純なクラスでなければなりません:

class CreateUpdateMixin(object): 

    model = Person 
    fields = ['gender', 'last_name'] 

    field_attrs = {'gender': {'onchange':"alert('G')"}, 
        'last_name': {'onclick': "alert('LN')"}, 
        } 

は、その後、あなたがそうのようにそれを使用します。

class PersonUpdateView(CreateUpdateMixin, UpdateView): 
    pass 

class PersonCreate(CreateUpdateMixin, CreateView): 
    redirect_name = "people" 

    def get_form(self, form_class=None): 
     form = super(PersonCreate, self).get_form(form_class) 
     for key, value in self.field_attrs.items(): 
      form.fields[key].widget.attrs = value; 
     return form 
+0

solarissmoke、答えてくれてありがとう。しかし、私はその考えを理解できません。 PersonCreateとPersonUpdateViewでget_formメソッドを再定義することを提案しますか?そして、mixinはそれらのビューについて知りません。しかし、見解はミックスインについて知っている。特別なコードはビュー内にあります:フィールドとその属性。一般的なコードはミックスインする必要があります。とにかく、あなたが正しく理解すれば、コードの複製を提供しているようです。これは、ミックスインなしでget_formメソッドを再定義するより複雑です。私がそのアイデアを捉えていないのなら、許してください。 – Michael

+0

申し訳ありませんが、私はあなたの質問を理解していないようです。私は本当にあなたのコメントを残念ながら理解していません... – solarissmoke

+0

私は説明が不器用だった場合、私を許してください。 mixinを使って問題に対処しました。あなたが提案したようにはなりませんが、完璧に動作します。ご協力ありがとうございます。 – Michael

関連する問題