Мастер форм Django сохранит и перейдите к предыдущему шагу

У меня есть работающий 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>

но ни один из них, кажется, не делает то, что я хочу сделать.


person gmorell    schedule 26.09.2013    source источник
comment
Я думаю, что это ожидаемо, поскольку пользователь хотел бы отправлять данные только при переходе к следующему шагу. При переходе к предыдущему шагу пользователь мог не заполнить данные на текущем шаге!   -  person Rohan    schedule 27.09.2013
comment
Зачем ему проверять данные при переходе к предыдущему шагу? В этом случае вы будете публиковать в другом представлении (предыдущем), поэтому, конечно, оно не будет проверено.   -  person Timmy O'Mahony    schedule 27.09.2013
comment
У меня были пользователи, жалующиеся на то, что они не сохраняют данные при переходе к предыдущему шагу. :\   -  person gmorell    schedule 28.09.2013


Ответы (2)


Если вы хотите, чтобы он проверял и сохранял данные в текущей форме, прежде чем вернуться к предыдущей форме, вам необходимо переопределить метод 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) 
person 3cheesewheel    schedule 04.11.2013
comment
Когда я пытался перейти к следующей форме, она просто отображала текущую форму, поэтому мне пришлось добавить условие if not go_to_step == None - person HenryM; 24.07.2019

Одним (возможно, элегантным) способом было бы использовать переменную 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().

person Brian H    schedule 24.04.2014
comment
Хорошее решение, но не означает ли это, что если вы находитесь на последнем шаге и хотите вернуться назад, поэтому вы нажимаете одну из кнопок, но на самом деле это отправит форму и запустит функцию done... Возможно, понадобится некоторая дополнительная логика, чтобы справиться с этим. - person jhrr; 10.07.2017