Django为无效表单返回错误500

时间:2011-10-14 00:25:22

标签: django django-templates django-views

可能这是另一个用户错误,但我遇到了一个奇怪的问题。

我正在开发一个平台,如果你不搞乱它,一切正常。现在我正在测试DEBUG = False和错误的用户行为,例如提交不完整的表单(将必填字段留空)。

问题是django(1.3.1)应该在用户发送无效表单时自动返回表单错误列表,而是为应用程序中的每个表单返回500错误。

我认为我的代码很好,但我不确定。

views.py

@permission_required('spaces.add_space')
def create_space(request):

    """
    Returns a SpaceForm form to fill with data to create a new space. There
    is an attached EntityFormset to save the entities related to the space. Only
    site administrators are allowed to create spaces.

    :attributes: - space_form: empty SpaceForm instance
                 - entity_forms: empty EntityFormSet
    :rtype: Space object, multiple entity objects.
    :context: form, entityformset
    """
    space_form = SpaceForm(request.POST or None, request.FILES or None)
    entity_forms = EntityFormSet(request.POST or None, request.FILES or None,
                                 queryset=Entity.objects.none())

    if request.user.is_staff:    
        if request.method == 'POST':
            space_form_uncommited = space_form.save(commit=False)
            space_form_uncommited.author = request.user

            if space_form.is_valid() and entity_forms.is_valid():
                new_space = space_form_uncommited.save()
                space = get_object_or_404(Space, name=space_form_uncommited.name)

                ef_uncommited = entity_forms.save(commit=False)
                for ef in ef_uncommited:
                    ef.space = space
                    ef.save()
                # We add the created spaces to the user allowed spaces

                request.user.profile.spaces.add(space)
                #messages.success(request, _('Space %s created successfully.') % space.name)
                return redirect('/spaces/' + space.url)

        return render_to_response('spaces/space_add.html',
                              {'form': space_form,
                               'entityformset': entity_forms},
                              context_instance=RequestContext(request))
    else:
        return render_to_response('not_allowed.html',
                                  context_instance=RequestContext(request))

模板太大而无法粘贴到此处,您可以在dpaste

中看到它

我不明白为什么django会返回500错误而不是显示错误列表。有人能帮助我吗?

完整的源代码(毕竟是GPL)在GitHub上。此模块位于src/e_cidadania/apps/spaces

3 个答案:

答案 0 :(得分:1)

我认为在保存之前你必须在表单上调用is_valid。

答案 1 :(得分:0)

ef_uncommited = entity_forms.save(commit=False)
            for ef in ef_uncommited:
                ef.space = space
                ef.save()

在它所说的行上,ef.space = space。什么是空间指的是什么?你还没有定义名称“space”所以我不确定ef.space被设置为什么,它是字符串'space'还是变量。

答案 2 :(得分:0)

尝试查看HTTP服务器日志以查看错误。这可能有助于缩小问题的范围。如果您使用的是Apache,则日志默认为/var/log/apache/-error.log。

当出现意外/无法解释的500错误时,您通常可以在Web服务器错误日志中找到更多详细信息。