我有一个工作的django formwizard,当我点击上一个按钮时,它不会验证当前输入。
我尝试了
的变体<input name="wizard_goto_step" class="btn btn-primary btn-large" type="submit" value="prev"/>
和
<button class="btn btn-info btn-large"
name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">
{% trans "prev step" %}
</button>
但这些似乎都没有做我想做的事。
答案 0 :(得分:2)
一种(可以说是优雅的)方式是使用与wizard_goto_step
不同的POST变量,然后覆盖WizardView.get_next_step()
:
def get_next_step(self, step=None):
return self.request.POST.get('wizard_next_step',
super().get_next_step(step))
然后,在前一步按钮/链接上使用name="wizard_next_step"
。这种方法的优势在于,如果您需要,旧的行为仍然可用,并且您没有重新实施WizardView.post()
。
答案 1 :(得分:1)
如果要在返回到上一个表单之前验证并保存当前表单上的数据,则需要覆盖post()
子类中的SessionWizardView
方法。您正在寻找的方法是self.storage.set_step_data()
和self.storage.set_step_files()
来保存当前的表单数据。
一个粗略的例子:
def post(self, *args, **kwargs):
go_to_step = self.request.POST.get('wizard_goto_step', None) # get the step name
form = self.get_form(data=self.request.POST, files=self.request.FILES)
current_index = self.get_step_index(self.steps.current)
goto_index = self.get_step_index(go_to_step)
if current_index > goto_index:
if form.is_valid():
self.storage.set_step_data(self.steps.current,
self.process_step(form))
self.storage.set_step_files(self.steps.current,
self.process_step_files(form))
else:
return self.render(form)
return super(NominateFormWizard, self).post(*args, **kwargs)