我的表单内容必须提交给另一个应用程序服务器进行验证和执行(具体来说,我称之为表单中已发布值的RESTful Web服务)。该服务将返回200 SUCCESS或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
哪一个更清楚?
答案 0 :(得分:2)
验证和执行
clean()
格式无执行或有状态更改。请。表单的clean()
应该只混淆表单上的数据,而不是其他任何地方。
如果存在状态更改,则必须位于非GET请求处理程序内的视图函数中。
答案 1 :(得分:0)
我通常在表单中封装这些类型的逻辑。由于您使用表单来验证数据,您还可以使用它来发送数据。这是有道理的,因为表单已经知道数据及其类型等(它有cleaned_data
字典)。
但处理数据和更改应用程序状态不应直接在验证逻辑中(例如在clean
方法中)。您应该将其放在表单的额外方法中 - 例如ModelForm
正在使用save()
方法执行此操作。
所以我的建议是有一个名为save()
的额外方法(如果方法实际将您的处理保存到REST服务中)或post_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()
方法
在你的第二个代码示例中。