2

人々がイベントに登録できるように、django フォーム ウィザードを構築しようとしています。フォーム ウィザードを通過して、doneメソッド内のデータを確認できます。問題は、event_id完了にも渡す必要があることです。event_idフォーム ウィザードを介して URL から取得するにはどうすればよい doneですか? 簡単な例?

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

2 に答える 2

4

dispatch質問は2年前ですが、完全を期すために、ウィザードクラスのメソッドをオーバーライドすることでこの問題を解決してきました。このメソッドは、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_dictSeatsModelAnotherModel

于 2014-10-20T05:26:07.107 に答える
4

それをフォームに入れて、そこから取得する必要があると思います。

そのモデル形式の場合、instance_dictパラメータをウィザード ビューに渡すことができます。instance_dict パラメータ。ただし、その場合、これらのパラメーターを使用してウィザード ビューを準備するラッパー ビューを実装する必要があります。このようなもの:

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],
             })
于 2012-08-07T08:54:57.033 に答える