Передача данных из представления в форму в django

<

У меня есть django formtool: на первом шаге нужно вставить имя и выбрать N значений из MultipleChoiceField. Когда пользователь отправляет эту форму на втором шаге, мне нужно показать N MultipleChoiceField, где каждый элемент каждого MultipleChoiceField извлекается из базы данных.

Second steps...it shows only one multiple choice empty

Second steps desidered

Мне нужно взять значения формы первого шага, получить из Db данные и отправить их на второй шаг (forms.py). Для второго шага, я полагаю, мне нужен набор форм. Я прочитал несколько вопросов о передаче значения из представления в форму, но не нашел решения. Вот мой код:

forms.py

from django import forms
from station.models import Station
from django.forms import formset_factory
from .models import Vdl


station_all=Station.objects.all()


class VdlSelectStationsForm(forms.Form):
    vdl_name = forms.CharField(label='nome virtual data logger', max_length=20,
                                 widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'nome vdl'}))
    
    stations = forms.ModelMultipleChoiceField(queryset=station_all)
    

class VdlSelectSensorsForm(forms.Form):
    sensor_list_for_station = forms.ModelMultipleChoiceField(queryset=Vdl.objects.all())   #filter(id_user = id_user))


VdlSelectSensorsForm = formset_factory(VdlSelectSensorsForm, extra=1)

views.py

from django.shortcuts import render
from .forms import VdlSelectStationsForm, VdlSelectSensorsForm
from formtools.wizard.views import SessionWizardView


class VdlWizard(SessionWizardView):
    template_name = "vdl.html"
    form_list = [VdlSelectStationsForm, VdlSelectSensorsForm]

    def get_form_initial(self, step):
        initial = {}

        # If at second step, add image path to initial data for canvas field
        if step == '1':
            first_step_data = self.storage.get_step_data('0')
            print('first_step_data ', first_step_data['0-stations'])

            form = VdlSelectSensorsForm(initial={"form_field": first_step_data})

            def initial_value(request):
                my_values = [1, 2, 3]
                return my_values
                initial_value(request, my_values)

        return self.initial_dict.get(step, initial)

    def parse_params(self, request, *args, **kwargs):
        current_step = self.determine_step(request, *args, **kwargs)
        if request.method == 'POST' and current_step == 0:
            form = self.get_form(current_step, request.POST)
            if form.is_valid():
                self.initial[(current_step + 1)] = {
                    'vdl_name': form.cleaned_data['vdl_name'],
                    'stations': form.cleaned_data['stattions'],
                }

    def done(self, form_list, **kwargs):
        form_data = process_form_data(form_list)

        context = {
            'form_data': form_data,
        }

        return render(self.request, 'vdl.html', {'form_data': [form.cleaned_data for form in form_list],})

def process_form_data(form_list):
    form_data = [form.cleaned_data for form in form_list]

    return form_data

vdl.html

{% extends "base.html" %}
{% load i18n %}

{% block content %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
{% for field in form %}
    {{field.error}}
{% endfor %}


<form action="" method="post">
  {% csrf_token %}
  <table>
  {{ wizard.management_form }}
  {% if wizard.form.forms %}
    {{ wizard.form.management_form }}
    {% for form in wizard.form.forms %}
      {{ form }}
    {% endfor %}
  {% else %}
    {{ wizard.form }}
  {% endif %}
  </table>
  {% if wizard.steps.prev %}
  <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
  <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
  {% endif %}
  <input type="submit" value="Invia"/>
</form>


{% endblock %}

models.py

from django.db import models

class Vdl(models.Model):
    id_vdl = models.IntegerField(primary_key=True, unique=True)
    vdl_name = models.CharField(blank=False, max_length=20)
    id_vdl_station = models.CharField(blank=False, max_length=100)
    id_user = models.IntegerField()

    class Meta:
        db_table = 'vdl'
Вернуться на верх