Python 我应该什么时候提交Django表格';结果如何?
我表单的内容必须提交给另一个应用服务器进行验证和执行(具体来说,我使用表单中发布的值调用RESTful web服务)。该服务将返回一个200成功或400/409错误,并带有一个描述确切字段错误的正文 我应该什么时候提交?我应该在以下视图中执行此操作: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
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服务可能会进行自动提交的更改。