【问题标题】:django inlineformset throws IndexError: list index out of range on savedjango inlineformset 抛出 IndexError: list index out of range on save
【发布时间】:2014-03-24 12:02:45
【问题描述】:

所以这个杀了我一天,我仍然不知道为什么我的解决方案有效。我想我会分享它以防有人遇到这个问题。
Django 1.6

我有一个 FormView 和一个表单和内联表单集。 我自己处理帖子

def post(self, *args, **kwargs):
    foo_form = self.form_class(self.request.POST)    
    if foo_form.is_valid():
        foo = foo_form.save(commit=False)        

        bar_formset = BarInlineFormset(self.request.POST, instance=foo)                
        if bar_formset.is_valid():
            foo.save()
            bar_formset.save()

            # redirect here
            return HttpResponseRedirect('whatever')


    kwargs['form'] = foo_form
    # in my get_context_data I'm setting context['bar_formset'] if i pass it in as a kwarg so errors from the articleformset are retained
    kwargs['bar_formset'] = bar_formset
    context = self.get_context_data(**kwargs)    

    return render(self.request, self.template_name, context)

这适用于创建全新的 foo。但是,一旦您尝试编辑 foo 或其对应的条形图,您就会得到一个
IndexError: list index out of range。
错误其实和
https://code.djangoproject.com/ticket/15574

一模一样

然而,通读这个错误,症状根本不一样——即没有同时编辑对象,没有删除或更改关系。

发生了什么事?

【问题讨论】:

    标签: python django django-forms django-class-based-views inline-formset


    【解决方案1】:

    在浪费了一整天的时间(包括浏览 django 源代码)之后,没有想到任何东西,我想我可能会通过将实例设置为新的尚未保存的 foo 来犯错误。

    因此,如果我们正在编辑现有的 foo,我只是将实例更改为实际的 foo 并且世界再次一切正常。 =\

    我认为实例尚未提交的事实是内联表单集令人讨厌的原因,但我不知道具体原因。也许有人可以帮助阐明 cmets

    def post(self, *args, **kwargs):
        try:
            foo = Foo.objects.get(id=self.kwargs['pk'])
        except KeyError:
            foo = Foo()
        foo_form = self.form_class(self.request.POST, instance=foo)            
        bar_formset = BarInlineFormset(self.request.POST, instance=foo_form.instance)                
        if foo_form.is_valid() and bar_formset.is_valid():
                foo_form.save()
                bar_formset.save()
    
                # redirect here
                return HttpResponseRedirect('whatever')
    
    
        kwargs['form'] = foo_form
        # in my get_context_data I'm setting context['bar_formset'] if i pass it in as a kwarg so errors from the articleformset are retained
        kwargs['bar_formset'] = bar_formset
        context = self.get_context_data(**kwargs)    
    
        return render(self.request, self.template_name, context)
    

    【讨论】:

    • 伙计,我太笨了。我应该只在表单对象上使用实例。相应地编辑答案。
    • 哇,我今天真是个白痴。我认为问题的根本原因是我没有使用 foo 实例实例化表单。我假设页面上的表单是使用 id 字段呈现的,但事实并非如此。
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2019-02-23
    • 1970-01-01
    • 2021-10-27
    • 2015-02-11
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    相关资源
    最近更新 更多