我最近通过子类化 FormView
学习了 Django 表单,其中所需的表单被分配给 FormView.form_class
属性。当表单通过验证时,form_valid()
方法被调用(针对那个表单)。例如:
from accounts.forms import SignUpForm, UpdateAccountForm, UpdateBillingForm
class SignUpView(FormView):
form_class = SignUpForm
def form_valid(self, form):
# code when form validates...
但是,我现在遇到一种情况,我需要在一个页面上显示三个不同的表单(用户一次只能看到一个表单)。所以,我想在同一个 View 中处理它们。
是否可以使用 FormView 制作多表单页面?我不确定如何处理它,无论是将多个表单传递给 View (例如另一个 UpdateAccountForm 和 UpdateBillingForm),还是区分提交/验证的表单?什么是最好的方法?
最佳答案
嗯,对于它的值(value),这是最终对我有用的东西,使用通用 View 。
1) 我为页面上的每个单独表单添加了一个隐藏的输入字段(名为“action”)。例如,这是用于更新用户信息的表单,它正在拉取 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) 在我的 View 逻辑中,我可以通过应用前缀来区分表单(根据其他 SO 帖子和 Django docs )。然后,根据传入的“操作”,我只将适用的表单绑定(bind)到 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)
看起来效果不错,希望这是正确的方法(?)
关于python - Django:使用 FormView 时可能有多种形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267752/