django is_valid 仅在没有断点时失败

问题描述 投票:0回答:2

美好的一天,

我们有一个基于

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)
django django-forms inline-formset
2个回答
0
投票

我认为原因是因为如果

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()

0
投票

此行为是由您的调试评估

Form.errors
以在本地窗口中显示它的值引起的,但
errors
实际上是一个
@property
方法,最终调用 clean() 和表单验证。这就是当您到达断点时行为不同的原因。 (这是 Django 恕我直言的一种设计缺陷。)

有关更多信息,请参阅此问题: 在 Pycharm 中调试表单验证

© www.soinside.com 2019 - 2024. All rights reserved.