Django SessionWizardView странное поведение

Я пытаюсь создать SessionWizardView, используемый для создания экземпляра моей модели Servizio, с 3 различными шагами/ModelForms.

class ServizioWizard(SessionWizardView):
    template_name = 'core/wizard_form.html'
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'wizard_storage'))
    form_list = [ServizioModelForm1, ServizioModelForm2, ServizioModelForm3]

    def get(self, *args, **kwargs):
        print(f"{self.get_form().fields=}")
        return super().get(*args, **kwargs)

    def post(self, *args, **kwargs):
        print("step before super().post():", self.steps.current)
        print("POST data:", self.request.POST)
        
        response = super().post(*args, **kwargs)
        
        print("step after super().post():", self.steps.current)
        
        return response
        
    def render_revalidation_failure(self, step, form, **kwargs):
        print(f"{form.errors=}")
        print(f"{step=}")
        return super().render_revalidation_failure(step, form, **kwargs)

    
    def done(self, form_list, **kwargs):
        print("done?")
        print(f"{self.request.POST=}")
        s = process_widard_forms_data(form_list)
        s.hub = self.request.user.referente.hub
        s.save()
        return redirect('core:home')

    def get_context_data(self, form, **kwargs):
        ctx = super(ServizioWizard, self).get_context_data(form=form, **kwargs)
        print(f"{self.request.session.keys()=}")
        print(f"{self.request.session['wizard_servizio_wizard']=}")
        r = self.request.user.referente
        ctx['referente'] = r
        ctx['hub'] = r.hub
        return ctx

Проблема, с которой я столкнулся, заключается в том, что всякий раз, когда я загружаю первый из этих шагов, я получаю следующий вывод в консоли:

self.get_form().fields={'nome': <django.forms.fields.CharField object at 0x706f84fe6800>, 'tipo': <django.forms.fields.TypedChoiceField object at 0x706f84fe6650>, 'categoria': <django.forms.models.ModelChoiceField object at 0x706f84fe6a40>, 'descrizione': <django.forms.fields.CharField object at 0x706f850289a0>, 'informazioni': <django.forms.fields.CharField object at 0x706f85028b20>}
self.request.session.keys()=dict_keys(['_auth_user_id', '_auth_user_backend', '_auth_user_hash', 'wizard_servizio_wizard'])
self.request.session['wizard_servizio_wizard']={'step': '0', 'step_data': {}, 'step_files': {}, 'extra_data': {}}
[09/Feb/2024 11:16:05] "GET /crea-servizio/ HTTP/1.1" 200 131264
self.get_form().fields={'nome': <django.forms.fields.CharField object at 0x706f850295a0>, 'tipo': <django.forms.fields.TypedChoiceField object at 0x706f85029120>, 'categoria': <django.forms.models.ModelChoiceField object at 0x706f85028ca0>, 'descrizione': <django.forms.fields.CharField object at 0x706f850293c0>, 'informazioni': <django.forms.fields.CharField object at 0x706f85029420>}
self.request.session.keys()=dict_keys(['_auth_user_id', '_auth_user_backend', '_auth_user_hash', 'wizard_servizio_wizard'])
self.request.session['wizard_servizio_wizard']={'step': '0', 'step_data': {}, 'step_files': {}, 'extra_data': {}}
[09/Feb/2024 11:16:05] "GET /crea-servizio/ HTTP/1.1" 200 131264
self.get_form().fields={'nome': <django.forms.fields.CharField object at 0x706f862fdba0>, 'tipo': <django.forms.fields.TypedChoiceField object at 0x706f862fc7f0>, 'categoria': <django.forms.models.ModelChoiceField object at 0x706f862fc730>, 'descrizione': <django.forms.fields.CharField object at 0x706f862fdc90>, 'informazioni': <django.forms.fields.CharField object at 0x706f862fd4b0>}
self.request.session.keys()=dict_keys(['_auth_user_id', '_auth_user_backend', '_auth_user_hash', 'wizard_servizio_wizard'])
self.request.session['wizard_servizio_wizard']={'step': '0', 'step_data': {}, 'step_files': {}, 'extra_data': {}}
[09/Feb/2024 11:16:05] "GET /crea-servizio/ HTTP/1.1" 200 131264

Как вы можете видеть, при первой загрузке страницы выполняется 3 GET-запроса, и все эти запросы имеют шаг 0. После этого, когда я отправляю любой из 3 шагов, я печатаю шаг, на котором я находился, и шаг, который должен быть загружен следующим, но текущий шаг всегда имеет значение 0, и еще нужно отметить, что сервер получает еще 2 GET-запроса, первый из которых печатает правильные поля для текущего шага, а второй печатает поля на шаге 0.

step before super().post(): 0
POST data: <QueryDict: {'csrfmiddlewaretoken': ['yGlJ1mvdOEZxAlhr7HcNhWxonHMP0O8teRn4xp8FjXTkFWqop4hh9gAabOLEeUir'], 'servizio_wizard-current_step': ['1'], '1-prezzo': ['0.0'], '1-iva': ['22'], '1-tariffa_5': [''], '1-tariffa_10': [''], '1-tariffa_20': [''], '1-sconti_euro_1': [''], '1-sconti_percentuale_1': [''], '1-sconti_euro_2': [''], '1-sconti_percentuale_2': [''], '1-sconti_euro_3': [''], '1-sconti_percentuale_3': [''], '1-scadenza': ['3'], '1-prezzo_rinnovo': ['0.06']}>
self.request.session.keys()=dict_keys(['_auth_user_id', '_auth_user_backend', '_auth_user_hash', 'wizard_servizio_wizard'])
self.request.session['wizard_servizio_wizard']={'step': '2', 'step_data': {'1': {'csrfmiddlewaretoken': ['yGlJ1mvdOEZxAlhr7HcNhWxonHMP0O8teRn4xp8FjXTkFWqop4hh9gAabOLEeUir'], 'servizio_wizard-current_step': ['1'], '1-prezzo': ['0.0'], '1-iva': ['22'], '1-tariffa_5': [''], '1-tariffa_10': [''], '1-tariffa_20': [''], '1-sconti_euro_1': [''], '1-sconti_percentuale_1': [''], '1-sconti_euro_2': [''], '1-sconti_percentuale_2': [''], '1-sconti_euro_3': [''], '1-sconti_percentuale_3': [''], '1-scadenza': ['3'], '1-prezzo_rinnovo': ['0.06']}}, 'step_files': {'1': {}}, 'extra_data': {}}
step after super().post(): 2
[09/Feb/2024 11:20:35] "POST /crea-servizio/ HTTP/1.1" 200 132131
self.get_form().fields={'pipeline': <django.forms.fields.TypedChoiceField object at 0x706f862cc640>}
self.request.session.keys()=dict_keys(['_auth_user_id', '_auth_user_backend', '_auth_user_hash', 'wizard_servizio_wizard'])
self.request.session['wizard_servizio_wizard']={'step': '0', 'step_data': {}, 'step_files': {}, 'extra_data': {}}
[09/Feb/2024 11:20:35] "GET /crea-servizio/ HTTP/1.1" 200 131264
self.get_form().fields={'nome': <django.forms.fields.CharField object at 0x706f862ce050>, 'tipo': <django.forms.fields.TypedChoiceField object at 0x706f862cf2e0>, 'categoria': <django.forms.models.ModelChoiceField object at 0x706f862ce290>, 'descrizione': <django.forms.fields.CharField object at 0x706f862cf070>, 'informazioni': <django.forms.fields.CharField object at 0x706f862ccfa0>}
self.request.session.keys()=dict_keys(['_auth_user_id', '_auth_user_backend', '_auth_user_hash', 'wizard_servizio_wizard'])
self.request.session['wizard_servizio_wizard']={'step': '0', 'step_data': {}, 'step_files': {}, 'extra_data': {}}
[09/Feb/2024 11:20:35] "GET /crea-servizio/ HTTP/1.1" 200 131264

Вы можете увидеть то же самое в сессии, где иногда шаг 0 все еще печатается, даже если мы находимся на шаге 2. И наконец, форма всегда будет жаловаться на отсутствие полей, которые были отправлены на шаге 0 и не должны принадлежать следующим шагам.

Я не уверен, что тот факт, что 3/2 GET-запроса происходят на каждом шаге SessionWizard, связан с моей ошибкой, но я ожидаю, что шаг будет правильно обновляться при каждом сабмите, чего не происходит(?). В частности, я заметил, что что-то не так, когда третий шаг никогда не отправляется и мой экземпляр никогда не создается, а при печати ошибок формы я заметил, что представление всегда ожидает поля первой формы, даже если они на самом деле не нужны в текущем шаге.

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