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

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

【问题讨论】:

    标签: jquery django forms


    【解决方案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)
    

    【讨论】:

    • 谢谢,但从长远来看,这不是一个好的选择。假设如果我在模板中无法组合的其他地方使用第三种形式,那会怎样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2017-11-07
    • 1970-01-01
    • 2012-12-31
    • 2017-01-22
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多