2013-06-22 73 views
0

假設我有一個步驟的輸入和下一步的另一個輸入(我正在使用SessionWizardView)。我需要驗證下一步輸入與上一步的輸入相同。如果輸入與previos步驟中的輸入不相同,那麼更新驗證器以顯示正確的錯誤會很好,因爲我在提交之前使用了執行django表單驗證器的ajax驗證。驗證基於上一步

我想在第二步輸入驗證程序中使用ThreadLocal.get_current_request()獲取會話並以某種方式進行比較。但我不認爲這是一個很好的解決方案:)任何建議?

+0

難道你們就不能只是把輸入從上一步驟中'context'和比較它在下一步之前提交下一步? – karthikr

+0

你的意思是get_context_data()獲得上下文嗎?可能但是我怎樣才能比較下一步?主要想法 - 修改表單驗證器以某種方式顯示正確的錯誤? – Oink

+0

在提交第1步時,您將獲得價值。我要說的是,將此作爲上下文變量添加到步驟2.這樣,如果值相同,則可以在提交步驟2時輕鬆進行比較 – karthikr

回答

1

我認爲應該這樣做:

class MyWizard(SessionWizardView): 
    def get_form_kwargs(self, step): 
     kwargs = {} 
     if step == 'second_step': 
      cleaned_data = self.get_cleaned_data_for_step('first_step') 
      kwargs.update({'first_input': cleaned_data['first_input'] }) 

     return kwargs 

那麼你彈出它在你的第二個形式

class SecondForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     self.first_input = kwargs.pop('first_input', None) 
     super(SecondForm, self).__init__(*args, **kwargs) 

    def clean(self): 
     super(SecondForm, self).clean() 
     if any(self.errors): 
      return 

     # compare self.first_input with self.cleaned_data['second_input'] 

     return self.cleaned_data 
+0

太好了,謝謝! – Oink

+1

Actualy我能夠通過'self.storage.get_step_data'從first_step獲取數據。方法'get_cleaned_data_for_step'返回None,因爲裏面的方法'get_form'返回的是類而不是實例。或者我錯過了什麼? – Oink

+0

@Oink你說得對,storage.get_step_data對於簡單的情況是完美的(它需要驗證的原始數據)。我有點驚訝,你有一個get_cleaned_data_for_step問題。我無法幫助,因爲我沒有看到代碼。現在只需要使用get_step_data,如果你進入更復雜的嚮導過程,然後幫助你解決我的問題:) – mariodev