2012-09-19 2 views
1

답장을 보내 주셔서 감사합니다. 내가 다음에 코드를 변경하지만 나는 여전히 같은 예외를 얻고있다 :인라인 formset을 사용하여 객체를 업데이트 할 때 django-generic-views + 목록의 색인이 범위를 벗어남

/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

당신은 이상한 클래스 기반-뷰를 사용 : 아래

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

는 역 추적입니다. 이 논리를 get_context_data 메소드에 넣는 것이 좋다고 나는 생각하지 않는다. formset과 가장 중요한 것을 작성해야합니다. get_context_data는 컨텍스트를 리턴해야합니다. formset의 유효성 검사는 form_valid 메소드에서 이루어져야합니다.

+0

답장을 보내 주셔서 감사합니다! 여전히 동일한 예외가 발생하고 있습니다. – user528049

+0

form_valid 함수에 대한 유효성 검사를 제거했지만 동일한 예외가 발생했습니다. 위 코드를 추가했습니다! – user528049

0

여러 동시 편집 https://code.djangoproject.com/ticket/15574이있는 경우이 문제는 InlineFormSets의 알려진 문제점입니다.

인라인 formset 코드가 약간 부서지기 쉬운 것 같습니다. 관리 양식에 제출 된 데이터가 데이터베이스 상태와 일치하지 않으면 오류가 발생합니다.

+0

하지만 어떻게 해결할 수 있습니까? {{reward_formset.management_form}}과 같은 형식으로 추가했지만 항상 동일한 예외가 발생했습니다. – user528049

+0

이 문제를 해결하려면 InlineFormSet의 내부를 변경해야합니다. 필요한 변경 사항과 문제 해결 방법을 자세히 설명하는 패치가 있습니다. –

+0

어디에서 찾을 수 있습니까? 나는이 일에 정말로 붙어 있습니다 ... 당신이 저에게 세부 사항을 줄 수 있다면 정말 감사 할 것입니다! – user528049