Как вручную сбросить данные в шаге мастера formtool? - PullRequest
0 голосов
/ 28 января 2020

У меня есть мастер с несколькими шагами, организованными следующим образом:

1 -> 2 -> 3 -> 4 -> 6
          |         ^
          |         |
           --> 5 ---

, где шаг 6 - это просто просмотр данных на предыдущих шагах. Шаги 4 и 5 являются взаимоисключающими.

Если пользователь перемещается по форме 1,2,3,4,6, а затем решает использовать 5 вместо 4, я хочу иметь возможность сбросить данные в шаге 4. Как я могу вручную сбросить данные уже сохранены для шага 4 (или любого шага) мастера?

Ответы [ 2 ]

1 голос
/ 28 января 2020

Это на самом деле не задокументировано в django -formtools, но вы обнаружите, что WizardView имеет свойство self.storage, которое является экземпляром BaseStorage (в 'formtools.wizard.storage.base' ).

self.storage.data - это словарь всех сохраненных данных. Немного опасно манипулировать этим словарем напрямую, лучше использовать метод self.storage.set_step_data(step, data), чтобы изменить данные для указанного c step:

self.storage.set_step_data('4', {})

очистит данные для шага '4'.

Примечание: если вы также загружаете файлы, вы должны удалить их, что немного сложно, потому что self.storage.set_step_files(step, files) ничего не делает, если files пусто ({}). Посмотрите на этот метод, чтобы переопределить его или посмотреть, как удалить файлы из словаря данных.

0 голосов
/ 31 января 2020

Как обсуждалось в комментариях к ответу dirkgroten, у меня есть step в мастере форм, который formset. Для этого конкретного шага использование self.storage.set_step_data(step, {}) приводит к ошибке каждый раз, когда используется step или информация для step, потому что, как указал dirkgroten в своих комментариях, информация для ManagementForm отсутствует после ручной настройки данные для step.

Поэтому я просто удаляю пару key - value для step из self.storage. Делая это, я получаю нормальное поведение мастера формы, например, self.get_cleaned_data_for_step(step) возвращает None, если step не в self.storage, и formset правильно запускается при использовании step после удаления step от self.storage.

Чтобы удалить step из self.storage, я использовал метод process_step в formwizard.

def process_step(self, form):
    """ Process the form after step data is submitted and validated by jQuery.  """
 #--> Get form prefix
    prefix = form.prefix
 #--> Action per step
    if prefix == 'e':
     #--> Set previous experiment
        try:
            exp_save = self.get_cleaned_data_for_step('e')
            if exp_save is None:
                pass
            else:
                exp_save = exp_save['e_exp'].id
        except KeyError:
            exp_save = None
     #--> Get selected experiment
        exp_sel = form.cleaned_data['e_exp'].id
     #--> Compare and delete steps if needed
        if exp_save is None:
            pass
        else:           
            if exp_sel == exp_save:
                pass
            else:
                for stepN in self.delStep[exp_sel]:
                 #--> self.delStep is a dict with the steps to be deleted for each exp_sel
                    if stepN in self.storage.data['step_data'].keys():
                     #--> Remove the key-value pair from data and files if there is already something to delete
                        del self.storage.data['step_data'][stepN]
                        del self.storage.data['step_files'][stepN]
                    else:
                        pass                
    else:
        pass
 #--> Return as implemented in the base class
    return self.get_form_step_data(form)
#---

Это, как уже упоминалось dirkgroten, не удаляет оставшиеся файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...