2016-12-09 12 views
1

これで、1つのページに2つの異なるタグで区切られた2つのフォームタグを作成しようとしています。私はこれをどのように処理できるのだろうかと思っています。 別のアクションURLを使用すれば、簡単に処理できます。しかし、妥当性チェックのエラーがある場合、それはフォームに提出されているURLに行き、私はそれを望んでいません。私はそれがなぜ私が行動= ''を作っているのかをページの中にとどめておきたい。ここでDjango - 同じアクション属性を持つ単一ページ上の2つのフォームタグ

HTMLで

<!-----------template.html-----------> 
<div class=" tab"> 
    <!-- Nav tabs --> 
    <div class="card"> 
     <ul class="nav navbar-nav nav-tabs" role="tablist"> 
      <li role="presentation" class="active"><a href="#home" aria-controls="home" role="tab" data-toggle="tab">Info 1</a></li> 
      <li role="presentation"><a href="#groups" aria-controls="groups" role="tab" data-toggle="tab">Info 2</a></li> 
     </ul> 
    </div> 
</div> 
<div class="tab-content"> 
    <!--Personal Info --> 
    <div class="row tab-pane active" role="tabpanel" id="home"> 
     <!-- edit form column --> 
     <div class="info1"> 
      {% include template1 %} 
     </div> 
    </div> 
    <div role="tabpanel" class="tab-pane" id="groups"> 
     <div class="info2"> 
      {% include template2 %} 
     </div> 
    </div> 
</div> 

<!-----------template1-----------> 
<form method='post' action='' class="form-horizontal" role="form"> 
{%csrf_token%} 
<input value=something> 
<input type="submit" value="Save Changes" name="{{formA.prefix}}"> 
</form> 

<!-----------template2-----------> 
<form method='post' action='' class="form-horizontal" role="form"> 
{%csrf_token%} 
<input value=something> 
<input type="submit" value="Save Changes" name="{{formA.prefix}}"> 
</form> 

これを解決しようとする試みのためのコードです:

VIEWS.PY

def _get_form(request, form_class, prefix): 
    data = request.POST if prefix in request.POST else None 
    return form_class(data, prefix = prefix) 
class MyView(LoginRequiredMixin,TemplateView): 
    login_url = '../login/' 
    template_name = 'template.html' 

    def get(self, request, *args, **kwargs): 
     return self.render_to_response({'formB':FormB(prefix='prefixA-'),'formB':FormB(prefix='prefixB-')}) 

    def post(self, request, *args, **kwargs): 
     formA = _get_form(request, FormA, 'payment-') 
     formB = _get_form(request, FormB, 'user-') 
     if formA.is_bound and formA.is_valid(): 
      # Do Something 
     elif formB.is_bound and formB.is_valid(): 
      # Do Something 
      # Update user 
      obj = userForm.save(commit=False) 
      logger.error(obj.first_name) 
      obj.save() 
     return self.render_to_response({'paymentForm':paymentForm, 'userForm':userForm}) 

FORMS.PY

class FormB(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = [some fields] 
     widgets = { 
      'password': forms.PasswordInput(), 
     } 
    def save(self, commit=True): 
     user = super(FormB, self).save(commit=False) 
     user.set_password(self.cleaned_data["password"]) 
     if commit: 
      user.save() 
     return user 

class FormA(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = [some fields] 
    def save(self, commit=True): 
     user = super(FormA, self).save(commit=False) 
     return user 

私は間違っていますが、フォームは送信されないか、または.is_valid()が失敗し、フォームは実際に何もしません。誰もが私を解決するのを助けてくださいお願いしますか? ありがとうございました!

+0

どのようにフォームを提出していますか?両方の書式を同時に提出する意思はありますか?またはどちらか他の人ですか? –

+0

それはどちらか一方です。 それぞれには別に送信ボタンがあります。 実際、formBはユーザー情報を更新するためのものなので、私はいくつかのフォームに分割することも考えていました。ユーザーが編集ボタンをクリックすると、各フィールドを個別に編集することができます。 –

+0

こんにちはジョン!これは非常に解決しやすい問題ですが、心配しないでください!あなたはDjangoで何かできます:)フォームの無効時にリダイレクトされるURLの問題の要点は私の理解です。各フォームには「MyV​​iew」とは別のビューがありますか?無効な場合、代わりにどのビューが返されますか? (まだインストールされていなければ、ビューのデバッグに役立つdjango-debug-toolbarを入手してください。) – ninapavlich

答えて

0

あなただけのコードを洗浄することにより、すべての問題を修正することができるはずです。

  1. あなたの2番目の形式は、間違った接頭辞を持っています。

    <!-----------template1-----------> 
    <form method='post' action='' class="form-horizontal" role="form"> 
    {% csrf_token %} 
    {{ formA }} 
    <input type="submit" value="Save Changes" name="{{ formA.prefix }}"> 
    </form> 
    
    <!-----------template2-----------> 
    <form method='post' action='' class="form-horizontal" role="form"> 
    {% csrf_token %} 
    {{ formB }} 
    <input type="submit" value="Save Changes" name="{{ formB.prefix }}"> 
    </form> 
    
  2. get()すぎ

    def get(self, request, *args, **kwargs): 
        return self.render_to_response({ 
         'formA': FormA(prefix='prefixA-'), 
         'formB': FormB(prefix='prefixB-') 
        }) 
    
  3. post()間違った接頭辞を持って間違った接頭辞と変数名を持っています

    def post(self, request, *args, **kwargs): 
        formA = _get_form(request, FormA, 'prefixA-') 
        formB = _get_form(request, FormB, 'prefixB-') 
        if formA.is_bound and formA.is_valid(): 
         # Do Something 
        elif formB.is_bound and formB.is_valid(): 
         # Do Something 
         # Update user 
         obj = formB.save(commit=False) 
         logger.error(obj.first_name) 
         obj.save() 
    
        return self.render_to_response({ 
         'formA': formA, 
         'formB': formB 
        }) 
    

https://docs.djangoproject.com/en/1.10/ref/forms/api/#prefixes-for-forms

関連する問題