Как передать объект запроса для динамической формы в 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, это должно работать отлично, но, кажется, это плохой способ...

Вернуться на верх