python - Django:使用 FormView 时可能有多种形式?

标签 python django

我最近通过子类化 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/

相关文章:

python - Pandas 中的 lambda 函数后索引列消失

python - 解包从函数返回的可变长度列表

Python/Numpy 每第 n 行切片一个数组

python - 如何在 Django 中记录成功和失败的登录和注销尝试?

python - 在整个过程完成之前使用 FormWizard 并保存表单数据?

Python:如何将变量用作字符串?

python - min python 的意外行为

python - Tornado 和 ZeroMQ

django - 保存 geodjango PointField 时出错

django cms - 通过 slug 解析页面 url