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...
<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>
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)
Form
API(少なくとも有用な部分)を模倣し、3つのフォームをラップするプレーンなpythonクラスを作成できます。どのフォームが送信されたかを検出するには、各フォームにフォームの識別子を含む非表示の入力を追加するだけです(ヒント:フォームにプレフィックスを使用し、識別子として同じプレフィックスを使用します)。関連記事