首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用内联表单集更新对象时,django-generic-views +列表索引超出范围异常

使用内联表单集更新对象时,django-generic-views +列表索引超出范围异常
EN

Stack Overflow用户
提问于 2012-09-19 20:19:40
回答 2查看 550关注 0票数 1

感谢你们的回复。我仍然得到相同的异常,尽管我将代码更改为以下代码:

代码语言:javascript
复制
class ProjectUpdateView(UpdateView):
form_class = ProjectForm
template_name = 'projects/project_create.html'
success_url = reverse_lazy('projects-list')

def get_object(self, queryset=None):
    obj = Project.objects.get(id=self.kwargs['pk'])
    return obj

def get_context_data(self, **kwargs):
    context = super(ProjectUpdateView, self).get_context_data(**kwargs)
    project = Project.objects.get(id=self.kwargs['pk'])

    if self.request.POST:
        context['reward_formset'] = ProjectRewardFormSet(self.request.POST, self.request.FILES, instance=project)  
    else:
        context['reward_formset'] = ProjectRewardFormSet(instance=project)
    return context

def form_valid(self, form):
    context = self.get_context_data()
    reward_formset = context['reward_formset']
    if reward_formset.is_valid():
        self.object = form.save(commit=False)
        self.object.owner = self.request.user
        self.object.save()
        reward_formset.instance = self.object
        reward_formset.save()
        return HttpResponseRedirect(self.get_success_url())
    else:
        return self.render_to_response(self.get_context_data(form=form)) 

下面是回溯:

代码语言:javascript
复制
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/core/handlers/base.py in get_response
111.                         response = callback(request, *callback_args, **callback_kwargs)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/contrib/auth/decorators.py in _wrapped_view
20.                 return view_func(request, *args, **kwargs)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/views/generic/base.py in view
48.             return self.dispatch(request, *args, **kwargs)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/views/generic/base.py in dispatch
69.         return handler(request, *args, **kwargs)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/views/generic/edit.py in post
172.         return super(BaseCreateView, self).post(request, *args, **kwargs)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/views/generic/edit.py in post
138.             return self.form_valid(form)
...

▶ Local vars
/home/lara/.venv/reztarter/reztarter/../reztarter/projects/views.py in form_valid
22.         context = self.get_context_data()
...

▶ Local vars
/home/lara/.venv/reztarter/reztarter/../reztarter/projects/views.py in get_context_data
39.             context['reward_formset'] = ProjectRewardFormSet(self.request.POST)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/forms/models.py in __init__
697.                                                 queryset=qs, **kwargs)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/forms/models.py in __init__
424.         super(BaseModelFormSet, self).__init__(**defaults)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/forms/formsets.py in __init__
50.         self._construct_forms()
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/forms/formsets.py in _construct_forms
115.             self.forms.append(self._construct_form(i))
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/forms/models.py in _construct_form
706.         form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs)
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/forms/models.py in _construct_form
451.             kwargs['instance'] = self.get_queryset()[i]
...

▶ Local vars
/home/lara/.venv/reztarter/lib/python2.7/site-packages/django/db/models/query.py in __getitem__
190.             return self._result_cache[k]
...

▶ Local vars
EN

回答 2

Stack Overflow用户

发布于 2012-09-19 23:08:15

您正在使用奇怪的基于类的视图。我不认为把这个逻辑放在get_context_data方法中是可以的。您应该只放在表单集的创建和最重要的事情- get_context_data应该返回上下文。表单集的验证应该在form_valid方法中进行。

票数 0
EN

Stack Overflow用户

发布于 2012-09-19 23:15:43

当存在多个同时编辑https://code.djangoproject.com/ticket/15574时,这是InlineFormSets的一个已知问题。

看起来内联的表单集代码有点脆弱。当管理表单中提交的数据与数据库的状态不一致时,将抛出错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12494566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档