2012-09-19 21 views
1

謝謝你們的答覆。我仍然得到同樣的異常,雖然我改變了代碼如下:Django的通用的視圖+列表索引超出範圍異常FORMSET

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

下面是回溯:

/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 
+0

你能後的追蹤? –

+0

感謝您的回覆,我添加了回溯!我感謝您的幫助!!! – user528049

回答

0

您正在使用基於類的視圖奇怪。我不認爲把這個邏輯放在get_context_data方法中是可以的。你只應該把formset的創建和最重要的事情 - get_context_data應該返回上下文。 formset的驗證應該在form_valid方法中進行。

+0

謝謝你們的回覆!我仍然得到相同的異常: – user528049

+0

我嘗試刪除驗證到form_valid函數,但我仍然得到相同的異常,我添加了上面的代碼! – user528049

0

這是一個已知的問題InlineFormSets當有多個同步編輯https://code.djangoproject.com/ticket/15574

看起來,內聯的formset代碼有點脆弱。當在管理表單中提交的數據與數據庫的狀態不一致時,會引發錯誤。

+0

但我該如何解決?我在表單中添加的以下:{{reward_formset.management_form}},但總是相同的異常 – user528049

+0

修復,這需要改變InlineFormSet的內部。有一個補丁可以詳細說明所需的更改以及他們打算如何解決問題。 –

+0

我在哪裏可以找到它?自從今天以來,我一直都在堅持......如果你能給我更多的細節,我將不勝感激! – user528049