【问题标题】:django is_valid only fails when no breakpointdjango is_valid 仅在没有断点时失败
【发布时间】:2015-03-24 19:51:14
【问题描述】:

早安,

我们有一个基于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


    【解决方案1】:

    我认为原因是因为您仅在 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()
    

    【讨论】:

    • 感谢您的回复。该代码确实对错误情况有响应,但我没有包含它,因为它不相关。问题是 is_valid 在带断点的调试中的不同行为(运行良好)与常规运行(在 is_valid 代码中的某处出现异常而没有返回到视图函数)。
    • 通过在处理异常的 django.core.handlers.base.py 中放置一个断点来设法追踪它。结果表明模型有一个非必需的外键,我们为其设置了空白=真,但忘记设置空=真。仍然没有解释为什么它在带有断点的调试中工作!
    • 也许你的断点允许这段代码通过避免github.com/django/django/blob/1.7.3/django/forms/forms.py#L151异常来返回True
    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2014-05-26
    • 2015-10-21
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多