2017-05-22 12 views
0

ModelFormに表示されるフィールドを動的に変更することはできますか?ModelFormのフィールドを動的に変更する

私は、ユーザーが(フォームを追加を使用して)フロントエンドから(モデルの)新しいインスタンスを追加したときModelForm内のフィールドのほんの数を表示しようとしていますが、フィールドの数が多いほど、ときに、ユーザーの編集インスタンス(編集フォームを使用)。そのdoesntの以来の追加および編集のための2つの別々のクラスを避けるためにしようと

class SchoolForm(ModelForm): 

    class Meta: 
     model = School 
     #want to change the fields below dynamically depending on whether its an edit form or add form on the frontend 
     fields = ['name', 'area', 'capacity', 'num_of_teachers'] 
     widgets = { 
      'area': CheckboxSelectMultiple 
     } 
     labels = { 
      'name': "Name of the School", 
      'num_of_teachers': "Total number of teachers", 
     } 

が生乾きようだ:

Formクラスは次のようになります。私はget_form()機能を無効にすることができるadminページのために同じ質問のあるSOの投稿を見つけましたが、ここでは該当しません。

また、thisは、通常の方法として異なるクラスを使用し、動的フォームを代替として使用することを提案しています。おそらく、ダイナミクスフォームはここでの進歩ですが、完全にはわかりません(私はSchoolFormクラスで__init__()save()メソッドをオーバーライドしました)。

+0

フォームを動的に作成するのが、ここでは '__init()__'と 'save()'のカスタムメソッドを使用するのが理想です。今のところ、私は上記のクラスの_edit form_に必要なフィールドを_all_指定することに頼っていました。_add form_にはこれらのサブセットが必要です。私はそれがそれを行う最も簡単な方法だと思った。オプションを探そうとしている人には、[this](https://stackoverflow.com/questions/297383/dynamically-update-modelforms-meta-class/297478#297478)と[this](http:// bradmontgomery。 blogspot.in/2009/04/dynamically-displaying-fields-in.html)投稿者 – Anupam

答えて

0

私は正しい方法ではありませんが、私はクラス内のいくつかのメソッドを使用してフィールドを追加したり削除したりします。私は次のように使用しました:

class someForm(forms.ModelForm): 


    class Meta: 
     model = Foo 
     exclude = {"fieldn0","fieldn1"} 

    def __init__(self, *args, **kwargs): 
     super(someForm, self).__init__(*args, **kwargs) 

     self.fields['foofield1'].widget.attrs.update({'class': 'form-control'}) 

     if self.instance.yourMethod() == "FooReturn": 
      self.fields['city'].widget.attrs.update({'class': 'form-control'}) 
     else: 
      if 'city' in self.fields: del self.fields['city'] 

希望します。

+0

ありがとう@Zartchは、上記のように、既存のフィールドを更新または削除しているようです。フィールドを追加する方法はありますか(以前はフィールドリストには含まれていませんでしたが、モデル内にあります)。 – Anupam

+0

除外されていないフィールドはすべてフォームに表示されます。あなたがやりたいフィールドがいくつかあります - ディナム的には削除する必要があります:del self.fields ['field'] – Zartch

関連する問題