Django:FormViewを使用すると複数のフォームが可能ですか?

Source python django

最近、FormViewをサブクラス化してDjangoフォームを学習しました。ここで、目的のフォームがFormView.form_class属性に割り当てられています。フォームが検証されると、form_valid()メソッドが呼び出されます(その1つのフォームに対して)。例えば:
from accounts.forms import SignUpForm, UpdateAccountForm, UpdateBillingForm

class SignUpView(FormView):
    form_class = SignUpForm

    def form_valid(self, form):
    # code when form validates...

ただし、現在、1つのページに3つの一意のフォームが必要な状況になっています(一度に1つのフォームのみがユーザーに表示されます)。ですから、それらすべてを同じビューで処理したいと思います。

FormViewを使用してマルチフォームページを使用できますか?複数のフォーム(他のUpdateAccountFormやUpdateBillingFormなど)をビューに渡すことと、どちらが送信/検証されたかを区別することの両方の観点から、それを処理する方法がわかりませんか?最善の方法は何でしょうか?
推奨答え
さて、ここで価値があるのは、一般的なビューを使用して、最終的に私のために働いたものです。

1)ページ上の個々のフォームに非表示の入力フィールド(「アクション」という名前)を追加しました。たとえば、これはユーザーの情報を更新するためのフォームであり、UserFormを取得しています。
<form action='/account/' method='post'>{% csrf_token %}
   <input type='hidden' name='action' value='edit_user'> 
   {{ user_form.as_p }}
   <input type='submit' value='Update'>
</form>

2)ビューロジックでは、プレフィックスを適用することでフォームを区別できます(他のSO投稿およびDjango docsごとに)。次に、着信する「アクション」に応じて、該当するフォームをPOSTリクエストにバインドするだけです(したがって、検証がすべてのフォームに適用されるわけではありません)。私の場合、forms.pyでUserFormとBillingFormの2つのフォームが定義されています。
from django.views.generic.edit import View
from django.shortcuts import render
from django.http import HttpResponse

from accounts.forms import UserForm, BillingForm

class AccountView(View):

    def get(self, request):
        # code for GET request...

    def post(self, request):
        #instantiate all unique forms (using prefix) as unbound
        user_form    = UserForm(prefix='user_form')
        billing_form = BillingForm(prefix='billing_form')

        # determine which form is submitting (based on hidden input called 'action')
        action = self.request.POST['action']

        # bind to POST and process the correct form
        if (action == 'edit_user'):
            user_form = UserForm(request.POST, prefix='user_form')
            if user_form.is_valid():
                # user form validated, code away..

        elif (action == 'edit_billing'):
            billing_form = BillingForm(request.POST, prefix='billing_form')
            if billing_form.is_valid():
                # billing form validated, code away..

        # prep context
        context = {
            'user_form':    user_form,
            'billing_form': billing_form,
        }
        return render(request, 'accounts/account.html', context) 

うまく機能しているようですが、これが正しいアプローチであるといいのですが(?)
その他答え #1
Form API(少なくとも有用な部分)を模倣し、3つのフォームをラップするプレーンなpythonクラスを作成できます。どのフォームが送信されたかを検出するには、各フォームにフォームの識別子を含む非表示の入力を追加するだけです(ヒント:フォームにプレフィックスを使用し、識別子として同じプレフィックスを使用します)。

もう1つの解決策は、代わりに単純な関数ベースのビューを使用することですが、それでも、私に関する限り、同じ「フォームラッパー」パターンを使用します。

関連記事

SpringBootを使用してコントローラーにasynchronousRESTリクエストを実装するにはどうすればよいですか?
Loggingのベストプラクティス-メソッド呼び出しをログに記録するか、ターゲットメソッドの開始時にログに記録しますか?
numpyで基本的なキューブを構築しますか?
scipy.stats.linregress、numpy.polynomial.polynomial.polyfit、statsmodels.api.OLSの違い
Tensorflow: `batch_size`または `steps`入力データには `Tensor`または `NumPy`が必要です