我正在尝试构建一个django表单向导,以允许人们注册
事件。我可以通过表单向导查看done
方法中的数据。
问题是我还需要event_id
传入。如何得到
从网址通过表单向导进入event_id
的{{1}}?简单的例子?
done
答案 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_dict
和SeatsModel
的对象设置AnotherModel
的行为将无需使用包装器的用户功能;这可能是这样做的唯一实际优势。