我什么时候应该提交我的Django表格的结果?

时间:2010-08-19 20:32:50

标签: python django

我的表单内容必须提交给另一个应用程序服务器进行验证和执行(具体来说,我称之为表单中已发布值的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

哪一个更清楚?

2 个答案:

答案 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()方法 在你的第二个代码示例中。