Отправка данных django formwizard в API

Мне нужно предотвратить переход браузера к следующему экрану при возникновении ошибок во время отправки данных в API. Желательно выводить сообщение пользователю.

В функции done() я пытался вернуться к последнему шагу: Я пробовал поднимать ошибки валидации, что приводит к отображению ошибки валидации на экране отладки. Перенаправление на последний шаг приводит к потере данных формы и отображению последнего шага как первого

Я попытался отправить данные с помощью process_step(), если шаг последний, но ничего не получилось.

Поиск оказался очень сложным, и, скорее всего, я упускаю какой-то фундаментальный момент.

Ниже приведен самый близкий результат, который я могу получить с помощью функции done()

    def done(self, form_list, **kwargs):
        form_data = [form.cleaned_data for form in form_list]

        # form_data = process_form_data(form_list)

        response: DocumentResponse = add_admission(
            name_last=form_data[0]["name_last"],
            name_first=form_data[0]["name_first"],
            name_middle=form_data[0]["name_middle"],
            date_of_birth=form_data[0]["date_of_birth"],
            ssn=form_data[0]["ssn"],
            sex=form_data[1]["sex"],
            smoker=form_data[1]["smoker"],
            veteran=form_data[1]["veteran"],
            addr_street=form_data[2]["addr_street"],
            addr_street2=form_data[2]["addr_street2"],
            addr_city=form_data[2]["addr_city"],
            addr_state=form_data[2]["addr_state"],
            addr_zip=form_data[2]["addr_zip"],
            phone_mobile=form_data[3]["phone_mobile"],
            phone_home=form_data[3]["phone_home"],
            is_disabled=form_data[1]["disabled"],
        )

        if response.success:
            if not isinstance(response, AdmissionResponse):
                raise Exception("Invalid DocumentResponse Returned.")

            admission_response: AdmissionResponse = response
            client_id = admission_response.client_id
            triage = Screening.objects.get(name="Triage Risk")
            Assignment.objects.create(client_id=client_id, screening=triage)
            self.request.session["client_id"] = client_id
            return HttpResponseRedirect(reverse_lazy("client-screenings"))
        else:
            print("We gotta redirect to the last step w/ data")

Как бы это ни казалось халтурным, я смог добиться желаемого результата, вернувшись к идее process_steps(), вручную добавив сообщение и вернув последнюю форму.

def process_step(self, form):
    if self.steps.current == "3":

        step_form_data = form.cleaned_data
        step_data = self.get_all_cleaned_data()
        step_data.update(step_form_data)

        print(step_data)

        response: DocumentResponse = add_admission(
            name_last=step_data["name_last"],
            name_first=step_data["name_first"],
            name_middle=step_data["name_middle"],
            date_of_birth=step_data["date_of_birth"],
            ssn=step_data["ssn"],
            sex=step_data["sex"],
            smoker=step_data["smoker"],
            veteran=step_data["veteran"],
            addr_street=step_data["addr_street"],
            addr_street2=step_data["addr_street2"],
            addr_city=step_data["addr_city"],
            addr_state=step_data["addr_state"],
            addr_zip=step_data["addr_zip"],
            phone_mobile=step_data["phone_mobile"],
            phone_home=step_data["phone_home"],
            is_disabled=step_data["disabled"],
        )

        if response.success:
            # if not isinstance(response, AdmissionResponse):
            #     raise Exception("Invalid DocumentResponse Returned.")

            admission_response: AdmissionResponse = response
            client_id = admission_response.client_id
            triage = Screening.objects.get(name="Triage Risk")
            Assignment.objects.create(fcc_id=client_id, screening=triage)
            self.request.session["client_id"] = client_id

        else:
            messages.warning(self.request, response.message)
            self.render_goto_step("3")
            return

    return super().process_step(form)
Вернуться на верх