Python 如何使用递归验证函数验证表单

Python 如何使用递归验证函数验证表单,python,django,validation,recursion,Python,Django,Validation,Recursion,我试图递归地验证一些JSON post数据,但在“child”调用中返回错误响应时遇到问题。以下是一个简化版本: 发布数据: { response_type: "parent", subresponses: [ { response_type: "foo", value: "something" },{ response_type: "bar", value: "something else" } ] } po

我试图递归地验证一些JSON post数据,但在“child”调用中返回错误响应时遇到问题。以下是一个简化版本:

发布数据:

{
  response_type: "parent",
  subresponses: [
    {
      response_type: "foo",
      value: "something"
    },{
      response_type: "bar",
      value: "something else"
    }
  ]
}
post数据可以有任意数量的子
子响应

视图:

当然,
process\u response
函数将丢弃子对象中无效的
subresponse
返回的JsonResponse;我需要测试返回值

我考虑过在子级中引发异常并在父级中捕获它,但是
响应类型
可能不是
“父级”
——因此表单验证和异常引发将在该场景中的“顶层”发生。例如:

{
  response_type: "bar",
  value: "something"
}
有没有Djangoey的方法?如果我做得对,如何测试返回的
JsonResponse(status=400)
如果是这样?

那么:

def process_response(response):
    forms = {
        'foo': FooForm,
        'bar': BarForm,
    }
    if response.get('response_type') == 'parent':
        for subresponse in response.get('subresponses'):
            result = self.process_response(subresponse)
            if result.status_code != 200:
                return result
    else:
        form = forms[response.get('response_type')](response)
        if not form.is_valid():
            return JsonResponse({"message": str(form.errors)}, status=400)
        form.save()

    return HttpResponse(status=200)

区别在于,我们不是简单地调用
process\u response
,而是调用它,看看是否有问题。

你能给出调用
process\u response
的上层代码吗?我问这个问题是因为,
process\u response
如果成功则返回
None
如果出错则返回
JsonResponse
您是对的,为了简化代码,我在保存表单后忘记了返回Http200。我已经编辑好了
process\u resposne
实际上是在执行了一些json解码验证后由
post
调用的。很抱歉,有人指出我忘记了一行(保存表单后返回Http200)。函数的问题是,它在递归到第一个子级(第10行)后返回,它不会处理后续子级。这可以通过测试第9行的
结果来改变。状态\u code
。我更新了答案以反映您问题中的更新。
def process_response(response):
    forms = {
        'foo': FooForm,
        'bar': BarForm,
    }
    if response.get('response_type') == 'parent':
        for subresponse in response.get('subresponses'):
            result = self.process_response(subresponse)
            if result.status_code != 200:
                return result
    else:
        form = forms[response.get('response_type')](response)
        if not form.is_valid():
            return JsonResponse({"message": str(form.errors)}, status=400)
        form.save()

    return HttpResponse(status=200)