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

时间:2016-07-30 19:00:57

标签: jquery django forms

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

1 个答案:

答案 0 :(得分:0)

我想要的是,如果用户更改了配置文件更新表单上的任何数据并提交了有错误的密码更改表单,那么我应该看到密码表单上的错误和用户更改的数据更新表格。

解决此类问题的一种方法是将两种形式一起发送:

<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)