Django 在基于类的视图中处理多个表单

Posted

技术标签:

【中文标题】Django 在基于类的视图中处理多个表单【英文标题】:Django handle multiple forms in class based view 【发布时间】:2016-12-05 06:36:05 【问题描述】:

我有一个用于更新用户个人资料信息的更新视图。在该页面上,我添加了另一个单独的密码更改表单。现在,我所做的是检查是否已提交密码更改表单并采取了必要的操作。我想要的是,如果用户更改了个人资料更新表单上的任何数据并提交密码更改表单错误,然后我应该在密码表单上看到错误,在用户更新表单上看到更改的数据。怎么可能呢? P.S:我在想也许我可以通过 AJAX 请求来处理这个问题,我可以通过序列化它们来发送两个表单数据。但我希望它在没有任何 AJAX 调用的情况下工作。

【问题讨论】:

【参考方案1】:

"我想要的是,如果用户更改了个人资料更新表单上的任何数据并提交了错误的密码更改表单,那么我应该看到密码表单上的错误和用户更改的数据更新表格。"

处理此类问题的一种方法是将两个表单一起发送:

<form method="post">
    % csrf_token %

    <h2>Your User Update Form</h2>
    % user_update_form %

    <h2>Your Password Change Form</h2>
    % password_change_form %
</form>

然后在你看来:

    def get(self, request, *args, **kwargs):
        # initialize both forms with prefixes
        user_update_form = UserUpdateForm(prefix='user_update')
        password_change_form = UserPasswordForm(prefix='password_change')
        return self._render_form(user_update_form, password_change_form)

    def post(self, request, *args, **kwargs):
        # read forms from POST
        user_update_form = UserUpdateForm(request.POST, prefix='user_update')
        password_change_form = UserPasswordForm(request.POST, prefix='password_change')

        # validate password form
        if password_change_form.is_valid():
            # do something
        else:
            # password form has errors, so return both forms
            return self._render_form(user_update_form , password_change_form)

    def _render_form(self, user_update_form, password_change_form ):
        context = 'user_update_form': user_update_form, 'password_change_form': password_change_form
        return TemplateResponse(self.request, '**/your_template.html', context)

【讨论】:

谢谢,但从长远来看,这不是一个好的选择。假设如果我在模板中无法组合的其他地方使用第三种形式,那会怎样?

以上是关于Django 在基于类的视图中处理多个表单的主要内容,如果未能解决你的问题,请参考以下文章

如何为其他模板的表单显示和提交编写基于 Django 类的视图?

如何使用基于类的视图在同一模板中使用两个不同的 Django 表单

基于 Django 类的 post-only 视图

Django 基于类的视图:覆盖表单名称

Django:在基于类的视图中包含媒体(css/js)

将 html 表单数据获取到基于 django 类的视图中