2012-08-07 2 views
2

사람들이 이벤트에 등록 할 수 있도록 django 양식 마법사를 빌드하려고합니다. 양식 마법사를 통해 done 방법으로 데이터를 볼 수 있습니다. 문제는 또한 event_id도 전달해야합니다. 양식 마법사를 통해 URL에서 event_id을 어떻게 얻고 done에 넣으시겠습니까? 간단한 예?Django FormWizard를 통해 데이터 전달하기

------- urls.py --------- 
named_register_forms2 = (
    ('basicdata', SeatsForm), 
    ('form2', AnotherForm), 
) 

urlpatterns = patterns('', 
    url(r'^register/(?P<event_id>\d+)/$', register_wizard, name='register_step'), 
) 

------ forms.py ----------- 
class SeatsForm(forms.ModelForm): 

    class Meta: 
    model = MyModel 
    fields = [ 'last_name', 'first_name', 'address1', 'address2', 
       'city', 'state', 'zipcode', 'phone_number', 'email'] 

    def __init__(self, *args, **kwargs): 
     super(SeatsForm, self).__init__(*args, **kwargs) 

class RegisterWizard(SessionWizardView): 
    #storage_name = 'formtools.wizard.storage.session.SessionStorage' 
    template_name = 'wizard_form.html' 

    def done(self, form_list, **kwargs): 
     data = {} 
     for form in form_list: 
       data.update(form.cleaned_data) 
       print data 
     # I need event_id right here. How to get it? 
     return render_to_response('done.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
    }) 

답변

4

나는 폼에 넣어서 거기에서 가져와야한다고 생각합니다.

해당 모델 양식은 instance_dict param을 마법사보기로 전달할 수 있습니다. instance_dict param. 그러나이 경우 이러한 매개 변수를 사용하여 마법사보기를 준비 할 래퍼보기를 구현해야합니다. 이런 식으로 뭔가가 :

def wrapper_view(request, id): 
    #somecode 
    seats_instance = SeatsModel.objects.get(id=id) 
    another_instance = AnotherModel.objects.get(id=id) 
    inst_dict = { '0': seats_instance, 
        '1': another_instance 
       } 
    return RegisterWizard.as_view(named_register_forms2, instance_dict=inst_dict)(request) 

class RegisterWizard(SessionWizardView): 
    #storage_name = 'formtools.wizard.storage.session.SessionStorage' 
    template_name = 'wizard_form.html' 

    def done(self, form_list, **kwargs): 
     data = {} 
     seatform= form_list[0] 
     seatinst = form.save()  
     #save other forms 
     ... 
     #using seatinst get event id 

     return render_to_response('done.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
      }) 
+0

'wrapper_view'를 어떤 파일에 넣고 어떻게 호출합니까? – codingJoe

+0

@codingJoe는 매개 변수 또는'request.GET'에서'id'를 사용하여'seats_instance'와'another_instance'를 얻습니다. – Rohan

+0

죄송합니다. 이해가 가지 않습니다. 'seats_instance' 란 무엇입니까? 어떻게 거기에'id '를 넣을 수 있습니까? 그렇다면 완성 된 메소드에서'id '를 어떻게 얻습니까? – codingJoe

2

문제는 두 살이지만, 완성도, 나는 마법사 클래스의 dispatch 방법을 재정 의하여이 문제를 해결했습니다. 이 메서드는 URL 디스패처의 원시 인수를 사용하여 마법사에서 호출합니다. 다른 어떤 일이 발생하기 전에 마법사의 instance_dict (및 다른 마법사 멤버 일 수도 있음)을 수정할 수 있습니다.

class RegisterWizard(SessionWizardView): 
    #storage_name = 'formtools.wizard.storage.session.SessionStorage' 
    template_name = 'wizard_form.html' 

    def dispatch(self, request, id, *args, **kwargs): 
     self.instance_dict = { 
      '0': SeatsModel.objects.get(id=id), 
      '1': AnotherModel.objects.get(id=id), 
     } 
     return super(RegisterWizard, self).dispatch(request, *args, **kwargs) 

    def done(self, form_list, **kwargs): 
     data = {} 
     seatform= form_list[0] 
     seatinst = form.save()  
     #save other forms 
     ... 
     #using seatinst get event id 

     return render_to_response('done.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
     }) 

나는 모든 주요 기능 장점이 있는지 모르겠지만, 마법사가 조금 더 캡슐처럼 그것을 이런 식으로 일을 느낀다. 또한 이것이 dispatch 메소드의 의도 된 사용인지는 잘 모릅니다.

내가 생각 하나 RegisterWizard을 상속한다면 래퍼 함수의 사용자를 만들 필요없이 사용할 수 있습니다 것 SeatsModelAnotherModel의 개체로 instance_dict을 설정하는 행위; 이런 식으로하는 것이 실제적으로 유일한 이점 일 수 있습니다.

관련 문제