【问题标题】:Django form wizard save and go to previous stepDjango 表单向导保存并转到上一步
【发布时间】:2013-10-03 01:42:42
【问题描述】:

我有一个可用的 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>

但这些似乎都没有做我想做的事。

【问题讨论】:

  • 我认为这是意料之中的,因为用户只想在进入下一步时提交数据。当移动到上一步时,用户可能没有填写当前步骤中的任何数据!
  • 为什么在进行上一步时会验证数据?在这种情况下,您将发布到不同的视图(前一个),所以它当然不会验证。
  • 我有用户抱怨它在进行上一步时没有保存数据。 :\

标签: django django-formwizard formwizard


【解决方案1】:

这个问题有点老了,但我遇到了这个问题,想提供一个解决方案,以防其他人在谷歌上搜索这个问题。

我喜欢 Brian H 的解决方案,但如果您处于最后一步并且想要转到上一步,它实际上是要提交表单并运行 done 函数。我找不到解决此问题的解决方案,因此我将提出不同的解决方案。您需要做的就是覆盖WizardView 上的render_goto_step

def render_goto_step(self, *args, **kwargs):
    form = self.get_form(data=self.request.POST, files=self.request.FILES)
    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))
    return super().render_goto_step(*args, **kwargs)

本质上,它会在呈现给定步骤之前保存当前表单的数据,但前提是表单有效。我想你可以保存数据不管它是否有效,但我没有用这种方式测试过。

【讨论】:

    【解决方案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()

    【讨论】:

    • 很好的解决方案,但这并不意味着如果您在最后一步并且想要倒退,那么您单击其中一个按钮,但它实际上是要提交表单并运行done 函数...可能需要一些额外的逻辑来处理。
    【解决方案3】:

    如果您希望它在返回到前一个表单之前验证并保存当前表单上的数据,您需要在SessionWizardView 的子类中覆盖post() 方法。您正在寻找的方法是 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) 
    

    【讨论】:

    • 当我尝试转到下一个表单时,它只是重新显示了当前表单,所以我必须添加 if not go_to_step == None 条件
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2022-01-07
    • 2014-01-25
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多