美好的一天,
我们有一个基于
inlineformset_factory
的表格集。在处理 POST 的视图函数中,is_valid
函数只有在我们在 is_valid
行上设置断点进行调试时才会成功;如果我们使用没有断点的运行或调试,客户端会收到 500 错误。这显然很难追查问题!查看代码如下;非常感谢任何建议。
提前致谢, 兰德尔
@login_required
def child_view(request):
if request.method == 'POST':
if request.is_ajax():
parent_id = request.POST['parent_id']
parent_instance = get_object_or_404(ParentModel, parent_id=parent_id)
child_formset = ChildInlineFormSet(request.POST, instance=parent_instance)
print 'before'
if child_formset.is_valid():
print 'after' # never gets here unless breakpoint on previous line
child_formset.save()
response = json.dumps({'success': 'true'})
return HttpResponse(response)
我认为原因是因为如果
is_valid
检查通过,您只返回一个 HttpResponse,这就是为什么在其他情况下会出现 500 错误。
您的视图应该更像:
@login_required
def child_view(request):
if request.method == 'POST':
if request.is_ajax():
parent_id = request.POST['parent_id']
parent_instance = get_object_or_404(ParentModel, parent_id=parent_id)
child_formset = ChildInlineFormSet(request.POST, instance=parent_instance)
print 'before'
if child_formset.is_valid():
print 'after' # never gets here unless breakpoint on previous line
child_formset.save()
response = json.dumps({'success': 'true'}) # why string not bool?
return HttpResponse(response)
else:
response = json.dumps({'success': 'false'})
return HttpResponse(response)
return HttpResponseBadRequest()
此行为是由您的调试评估
Form.errors
以在本地窗口中显示它的值引起的,但 errors
实际上是一个 @property
方法,最终调用 clean() 和表单验证。这就是当您到达断点时行为不同的原因。 (这是 Django 恕我直言的一种设计缺陷。)
有关更多信息,请参阅此问题: 在 Pycharm 中调试表单验证