2013-09-26 2 views
2

나는 이전 버튼을 눌렀을 때 현재 입력의 유효성을 검사하지 않는 작업 장고 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

한 (틀림없이 우아한) 방법은 wizard_goto_step는 다른 POST 변수를 사용하는 다음 WizardView.get_next_step()를 오버라이드 (override) 할 : 다음

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