Как передать объект запроса для динамической формы в django-formtools form wizzard?
Вероятно, есть кто-то, кто пытался сделать многошаговую форму wizzard, но цель состоит в том, чтобы сделать их динамическими. Под динамическими я подразумеваю, что после отправки одной формы, эта форма остается на своем месте и данные из этой формы отправляются в ajax и если они валидны, то сервер отправляет html со второй формой. Кажется, что все просто, но я действительно затрудняюсь, как отобразить csrf_token
в динамических формах.
Итак, у меня есть main.html
, например:
<div class="col-xxl-6" id="testId">
{{ wizard.form }}
</div>
и частичные html-файлы с формами, например
first_form.html
:
{% load static %}
<form action="{% url 'app:url' %}" method="post" novalidate>
{% csrf_token %}
{{ wizard.management_form }}
{{ first_form.field }}
</form>
и second_form.html
одинаковы, допустим,
Итак, очевидно, что мне нужно передать запрос, и это вполне возможно сделать с помощью render_to_string
, если форма должна быть отправлена с помощью AJAX. Но в случае с обычным рендерингом (без AJAX) render_to_string
не является подходящим способом.
Еще одно лучшее место, которое я нашел: __init__
в моей форме
Я посмотрел на метод render()
в class RenderableMixin
, который является родительским для forms.Form, и захотел сделать что-то вроде этого:
class MyForm:
template_name = "app/templates/forms/first_form.html"
def __init__(self, request=None, *args, **kwargs):
self.request = request
super().__init__(*args, **kwargs)
def render(self, template_name=None, context=None, renderer=None):
renderer = renderer or self.renderer
template = template_name or self.template_name
context = context or self.get_context()
response = render_to_string(template, context, request)
return response
но self.request
obj почему-то не доступен в render, он просто None, но он определенно существует, так как я напечатал его в __init__
. И я также попытался сделать это напрямую (конечно, добавив позиционный аргумент для render):
form = form.render(request=request)
но это все равно None
Но на самом деле дело не в этом, я ищу лучший способ сделать это, возможно, кто-то уже сталкивался с этим
P.S. Есть еще один вариант - выводить форму без csrf_token
и, поскольку csrf_token
уже находится в cookie, просто отправлять его при необходимости, получая его с помощью Js, это должно работать отлично, но, кажется, это плохой способ...