2013-09-26 31 views
2

我有一個工作的django formwizard,當我點擊上一個按鈕時不會驗證當前輸入。Django窗體嚮導保存並轉到上一步

我試過在

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

的變化,但這些都不似乎做我想做的事情。

+1

我認爲這是預期的,因爲用戶只想在下一步時提交數據。當移動到上一步時,用戶可能沒有填充當前步驟中的任何數據! – Rohan

+0

爲什麼在進行上一步時驗證數據?在這種情況下,你將發佈到不同的視圖(前一個視圖),因此當然不會驗證。 –

+0

我已經讓用戶抱怨它沒有保存數據,當轉到上一步。 :\ – gmorell

回答

1

如果您希望它在回到先前表單之前驗證並保存當前表單中的數據,則需要覆蓋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) 
2

一個(可以說優雅)的方法是使用不同的POST可變比wizard_goto_step,然後重寫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()

+0

好的解決方案,但這並不意味着如果您正在進行最後一步並且想要倒退,那麼您點擊其中一個按鈕,但實際上它會提交表單並運行'done'功能...可能需要一些額外的邏輯來處理。 – jhrr