Отправка данных 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)