2016-12-14 22 views
0

同じページに2つのモデルフォームがあります。同じページ、同じモデル、Formsetなしで2つのdjangoモデルフォーム

 <form method="POST" action=""> {% csrf_token %} 
     {{ form1 }} 
     {{ form2 }} 
     <input type="submit" value="Save Selections"/> 
     </form> 

.htmlのforms.py

class RegistrationForm(forms.ModelForm): 
    class Meta: 
     model = Registration 
     fields = ['event'] 

views.py

form1 = RegistrationForm(request.POST or None, instance=user_reg1) 
form2 = RegistrationForm(request.POST or None, instance=user_reg2) 

if request.method == 'POST': 
     if form1.is_valid() and form2.is_valid(): 
      form1.save() 
      form2.save() 

を:フォームは、選択された単一のフィールド、eventを有します表示形式とプロポーザルを作成する私は値を変更して保存ボタンを押すと、常に両方のインスタンスにform2選択を保存します。

私はDOMのidが同じである、と私は(この場合にはblock)を登録モデルで一意のフィールドをつかんでDOM IDを変更することができましたことに気付きました

形。 PY

class RegistrationForm(forms.ModelForm): 
    class Meta: 
     model = Registration 
     fields = ['event'] 

    def __init__(self, *args, **kwargs): 
     block = kwargs.pop('block') # a unique field in the Registration model 
     super(RegistrationForm, self).__init__(*args, **kwargs) 

     if block:    
      DOM_id = "event-" + str(block) 
      self.fields['event'].widget.attrs.update({'id': DOM_id, }) 

これはフィールドに一意のIDを与えているが、両方のフォームがまだ同じidを持つdiv要素に包含される:div_id_event

レンデ赤HTML

<form method="POST" action=""> <input type='hidden' name='csrfmiddlewaretoken' value='...' /> 

    <div id="div_id_event" class="form-group"> 
     <label for="event-Flex-1" class="control-label requiredField">Event<span class="asteriskField">*</span> </label> 
     <div class="controls "> 
      <select class="select form-control" id="event-Flex-1" name="event" required> 
      <option value="">---------</option> 
      <option value="10">stuff</option> 
      ... 
      </select> 
     </div> 
    </div> 

    <div id="div_id_event" class="form-group"> 
     <label for="event-Flex-2" class="control-label requiredField"> 
        Event<span class="asteriskField">*</span> </label> 
     <div class="controls "> 
      <select class="select form-control" id="event-Flex-2" name="event" required> 
      <option value="">---------</option> 
      <option value="10">stuff</option> 
      .... 
      </select> 
     </div> 
    </div> 

    <input type="submit" value="Save Selections"/> 
</form> 

のid事項あれば私も知りません。 Formsetを使わずにこれら2つのフォームを協力させる方法がありますか?

答えて

1

この場合、DOM要素のIDは重要ではありません。重要なプロパティは入力要素のnameです。

ModelFormのprefix属性を使用する必要があるようです。ドキュメントをhttps://docs.djangoproject.com/en/1.10/ref/forms/api/#prefixes-for-formsにチェックしてください。

は、あなたが、あなたは、あなたが経験している名前空間の衝突を防ぐことができます前置引数、のために与えた値で始まるinput要素の名前になってしまいます

form1 = RegistrationForm(request.POST or None, instance=user_reg1, prefix='user1') 
form2 = RegistrationForm(request.POST or None, instance=user_reg2, prefix='user2') 

でフォームを初期化します。

関連する問題