2013-02-18 1 views
1

Django FormWizard를 사용하여 기존 개체를 편집하려고합니다. this blog post에 설명 된 기술을 따르고 있지만 작동하지 않습니다. 내 편집 화면은 다음과 같습니다.Django Formwizard 편집 : 초기 데이터 얻기

@login_required 
def edit_wizard(request, id): 
    thing = get_object_or_404(Thing, pk=id) 
    if thing.user != request.user: 
     raise HttpResponseForbidden() 
    else: 
     initial = {0: {'year': thing.year, 
         'make': thing.make, 
         'series': thing.series, 
         ....etc. 
         }, 
        1: {'condition': thing.condition, 
         ....etc. 
         }, 
        } 

    form = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial_dict=initial) 
    return form(context=RequestContext(request), request=request) 

사용자가 개체를 편집 할 수 있도록 마법사에 초기 데이터를 제공하는 방법을 이해할 수 있습니까? 당신의 아이디어에 감사드립니다!


편집 :이 아래 @ sneawo의 대답에 의해 해결되었다

TypeError at /edit/10/ __init__() takes exactly 1 argument (3 given) 

하지만 여전히 초기 데이터가 전달되지 않으며, (2/18/13)

은을 얻고 있었다 대신 마법사가 새 개체를 만듭니다.


편집 : (2/19/13)

class CreateWizard(SessionWizardView): 
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT)) 
    def done(self, form_list, **kwargs): 
     instance = Thing() 
     for form in form_list: 
      for field, value in form.cleaned_data.iteritems(): 
       setattr(instance, field, value) 
     instance.user = self.request.user 
     instance.save() 
     return render_to_response('wizard-done.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
     }) 
+0

당신이''else' 상태 '일 = 것 (사용자 = request.user)를 사용하는 이유는 무엇입니까? – sneawo

+0

예. 예. 내 실수. 그러나이 조건은 이제 TypeError : __init __()가 정확히 1 개의 인수 (주어진 3 개)를가집니다. 위의 세부 정보가 추가되었습니다. 어떤 아이디어 주셔서 감사합니다! –

+0

'CreateWizard' 클래스의 코드를 보여줄 수 있습니까? – sneawo

답변

2

를 사용하는 논의. 이전 버전 (1.3, 1.3 이전에는 없었던 것 같습니다)의 키워드 인수는 초기입니다. 또한 초기 데이터 딕트의 단계 키는 정수가 아닌 문자열이어야합니다.

initial = {'0': {'year': thing.year, 
       'make': thing.make, 
       'series': thing.series, 
        ....etc. 
       }, 
      '1': {'condition': thing.condition, 
        ....etc. 
       }, 
      } 

UPDATE : , 당신은 또한 ID를 설정해야합니다 같은 개체를 업데이트하려면, 그렇지 않으면 장고 업데이트 개체를 알 수있는 방법이 없습니다. 숨겨진 필드에 ID를 전달하는 간단한 방법이 있지만 (완료) 메서드에서 사용자 권한 검사를 다시 수행해야합니다.

initial = {0: {'id': thing.id, 


class CreateWizard(SessionWizardView): 
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT)) 
    def done(self, form_list, **kwargs): 
     id = form_list[0].cleaned_data['id'] 
     thing = get_object_or_404(Thing, pk=id) 
     if thing.user != self.request.user: 
      raise HttpResponseForbidden() 
     else: 
     instance = Thing() 
     for form in form_list: 
      for field, value in form.cleaned_data.iteritems(): 
       setattr(instance, field, value) 
     instance.user = self.request.user 
     instance.save() 
     return render_to_response('wizard-done.html', { 
      'form_data': [form.cleaned_data for form in form_list],}) 

및 코스 StepOneForm의

는 숨겨진 필드에 ID가 있어야합니다

class StepOneForm(forms.Form): 
    id = forms.IntegerField(widget=forms.HiddenInput) 
+0

@almalki 감사합니다.초기 데이터 dict를 문자열로 설정하면 폼에'initial_dict'를 얻을 수 있습니다. 그러나 원래 인스턴스를 수정하는 대신 새 인스턴스가 만들어집니다. 왜 그 이유를 이해하도록 도와 주실 수 있습니까? 고맙습니다! –

+0

@NickB 확실 함, 업데이트 된 답변보기 :) – almalki

+0

@almalki (+1) 도움에 감사드립니다! 유일하게 남아있는 문제는'global name '요청이'내 '의'return form' 라인에서 정의되지 않았다는 것입니다. 정보를 올바르게 반환하는 방법을 잘 모르겠습니다 .. 양식을 반환하는 방법에 대한 아이디어가 있습니까? 지식 공유에 정말 감사드립니다. 고맙습니다! –

1

시도하면 키워드 initial_dict 에서 초기 데이터를 전달 1.4 장고에 대한 문서, 당으로 form = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial=initial)