通过django FormWizard传递数据

时间:2012-08-07 06:38:14

标签: django django-forms

我正在尝试构建一个django表单向导,以允许人们注册 事件。我可以通过表单向导查看done方法中的数据。 问题是我还需要event_id传入。如何得到 从网址通过表单向导进入event_id的{​​{1}}?简单的例子?

done

2 个答案:

答案 0 :(得分: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],
             })

答案 1 :(得分:3)

问题是两年了,但为了完整起见,我一直在通过覆盖向导类的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的对象设置AnotherModel的行为将无需使用包装器的用户功能;这可能是这样做的唯一实际优势。