Python 我应该什么时候提交Django表格';结果如何?

Python 我应该什么时候提交Django表格';结果如何?,python,django,Python,Django,我表单的内容必须提交给另一个应用服务器进行验证和执行(具体来说,我使用表单中发布的值调用RESTful web服务)。该服务将返回一个200成功或400/409错误,并带有一个描述确切字段错误的正文 我应该什么时候提交?我应该在以下视图中执行此操作: if form.is_valid: result = submit_to_service(POST) if result.code in (400, 409): somehow_set_errors_on_the_f

我表单的内容必须提交给另一个应用服务器进行验证和执行(具体来说,我使用表单中发布的值调用RESTful web服务)。该服务将返回一个200成功或400/409错误,并带有一个描述确切字段错误的正文

我应该什么时候提交?我应该在以下视图中执行此操作:

if form.is_valid:
    result = submit_to_service(POST)
    if result.code in (400, 409):
        somehow_set_errors_on_the_form(form)
    else:
        go_on...
还是用Form.clean方法

def clean(self):
    result = submit_to_service(POST)
    if result.code in (400, 409):
        for field in result.errors:
            self._errors[field].append(result.errors[field])
    else:
        pass
以下哪一个更清楚

验证和执行

表单
clean()
中没有执行或有状态更改。请表单的
clean()
只会弄乱表单上的数据,而不会弄乱其他任何地方的数据


如果有状态更改,它必须位于非GET请求处理程序中的视图函数中。

我通常将这些类型的逻辑封装在表单中。由于您使用表单来验证数据,因此也可以使用表单来发送数据。这是有意义的,因为表单已经知道数据及其类型等(它有
cleaned_data
dictionary)

但处理数据和更改应用程序状态不应直接存在于验证逻辑中(例如,在
clean
方法中)。您应该将它放在表单的一个额外方法中,比如
ModelForm
使用
save()
方法

因此,我的建议是使用一个名为
save()
(如果该方法实际上将您的处理保存到REST服务中)或
post\u result()
的额外方法或类似的更适合您的方法

以下是一个例子:

# forms.py

class ValidateDataForm(forms.Form):
    ...

    def clean(self):
        # validation logic

    def save(self):
        post_results_to_service(self.cleaned_data)

# views.py

def view(request):
    if request.method == 'POST':
        form = ValidateDataForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = ValidateDataForm()

以上假设REST服务正在为您的应用程序更改状态 应用程序,例如,它实现一些业务逻辑。如果不是这样的话 并且您只使用该服务作为表单上输入数据的验证- 然后使用表单数据做一些不同的事情-我会提出一些建议 不一样

在这种情况下,代码应该像您建议的那样进入
clean()
方法
在您的第二个代码示例中。

您能给出一个简单的示例吗?@AJ:我不需要。问题中的示例1——如果它出现在视图函数中——是否更好。S.Lott,您如何回应下面Gregor的回答?他对ModelForm的
save
方法的评论似乎非常相关。@Chris R:我完全不同意这种方法。
表单.save()
不能与外部服务交互。该方法的语义是明确的。它必须正确处理
commit=False
选项;使用外部服务可能会使
commit=False
无法实现。web服务可能会进行自动提交的更改。