Ответ 1
Хорошо, для чего это стоит, что в конечном итоге сработало для меня, используя общий вид.
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:
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)
Кажется, хорошо работает, надеюсь, это правильный подход (?)