2012-08-07 55 views
2

我想構建一個Django表單嚮導來允許人們註冊一個 事件。我可以通過表單嚮導來查看done方法中的數據。 問題是我還需要event_id也通過了。如何通過表單嚮導從012 url轉到doneevent_id?簡單的例子?通過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帕拉姆嚮導視圖。 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 2012-08-08 00:44:59

+0

@codingJoe通過參數或'request.GET'中的'id'獲取'seat_instance'和'another_instance'的東西。 – Rohan 2012-08-08 04:06:35

+0

對不起,我不明白。什麼是'seat_instance'?以及如何將'id'放在那裏?那麼如何在完成的方法中使用'id'? – codingJoe 2012-08-09 02:12:15

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設置instance_dictSeatsModel和​​對象將是可用的,而不需要進行包裝功能的用戶的行爲;這可能是這樣做的唯一的實際優勢。