Как управлять несколькими наборами форм в Django с помощью JavaScript

У меня следующая проблема: я загружаю форму (Form A "Evento") для пользователя заполнения заявки, в этой форме я должен динамически загрузить другую форму (Form B "Logistica"), чтобы пользователь мог добавить несколько форм B, просто нажав на кнопку. Мне удалось динамически загрузить эти Logistica/Form B для пользователя, но когда я перехожу к части сохранения, мне удалось получить только поля в кортеже, например, у Form B есть поле под названием "nome", вместо того, чтобы получить N FormB "nome" полей, я получаю только 1 со значением [] со значениями каждой формы. Я понимаю, что Django думает, что вместо N FormB у меня только 1 FormB и конкатенирует поля. Проблема https://github.com/ian-santos-nascimento/Django-event-management

Это моя форма

Это мои взгляды на управление этой формой



@login_required(login_url='login')
def home(request):
    if request.method == 'POST':
        return evento_create_form(request)
    eventos = Evento.objects.only('nome', 'data_inicio', 'local', 'id_evento')
    return render(request, 'main/home.html', {'eventos': eventos})


@login_required(login_url='login')
def evento_create(request):
    if request.method == 'POST':
        form = CreateEventoForm(request.POST)
        logistica_formset = modelformset_factory(Logistica, CreateLogisticaForm,
                                                 fields=('nome', 'descricao', 'valor', 'dias', 'tipo'),
                                                 extra=request.POST['logistica-TOTAL_FORMS'], )
        logistica_forms = logistica_formset(request.POST, prefix='logistica')
        print(request.POST)
        if logistica_forms.is_valid():
            print(logistica_forms.errors)
            for logistica in logistica_forms:
                print('LOGISTICA'+logistica)
        if form.is_valid():
            evento = form.save(commit=False)
            comidas = criarComidasEvento(form)
            for comida_id, quantidade in comidas.items():
                comida = Comida.objects.get(pk=comida_id)
                evento.save()
                evento.comidas.add(comida, through_defaults={'valor': comida.valor, 'quantidade': quantidade})

            messages.success(request, 'Evento salvo com sucesso!')
            return HttpResponseRedirect(reverse('home'))
        else:
            message_error(request, form)
            return render(request, 'eventos/novoEvento.html', {'form': form})
    else:
        form = CreateEventoForm()
        return render(request, 'eventos/novoEvento.html', {'form': form, })

def evento_create_form(request):
    form = CreateEventoForm()
    logistica_formset = modelformset_factory(Logistica, CreateLogisticaForm, extra=2)
    logistica_form = logistica_formset(prefix='logistica')
    comidas = Comida.objects.all()
    return render(request, 'eventos/novoEvento.html',
                  {'form': form, 'comidas': comidas, 'logistica_formset': logistica_form})

Это две мои формы



class CreateLogisticaForm(forms.ModelForm):
    class Meta:
        model = Logistica
        fields = '__all__'
        exclude = ['evento_id']
        widgets = {
            'tipo': forms.Select(),
        }
        labels = {
            'valor': "Valor diária",
            'dias': "Qtd dias"
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.empty_permitted = True


class CreateEventoForm(forms.ModelForm):
    local = forms.ModelChoiceField(queryset=LocalEvento.objects.all().only('nome').order_by('nome'),
                                   widget=forms.Select(attrs={'class': 'form-control'}))

    data_inicio = forms.DateField(widget=forms.SelectDateWidget(attrs={'class': 'mt-3 mb-3 col-3'}))
    data_fim = forms.DateField(widget=forms.SelectDateWidget(attrs={'class': 'mt-3 mb-3 col-3'}))
    cliente = forms.ModelChoiceField(queryset=Cliente.objects.all().only('nome').order_by('nome'),
                                     label='Cliente',
                                     widget=forms.Select(attrs={'class': 'form-control'}))

    class Meta:
        model = Evento
        exclude = ['id_evento']
        fields = ['nome', 'descricao', 'observacao', 'comidas', 'data_inicio', 'local', 'cliente',
                  'data_fim']
        widgets = {
            'nome': forms.TextInput(attrs={'class': 'form-control'}),
            'descricao': forms.Textarea(attrs={'class': 'form-control', 'style': 'height: 200px;'}),
            'observacao': forms.Textarea(attrs={'class': 'form-control', 'style': 'height: 200px;'}),
            'qtd_dias_evento': forms.NumberInput(attrs={'class': 'form-control'}),
        }

И, наконец, моя модель


class Evento(models.Model):
    id_evento = models.AutoField(primary_key=True)
    nome = models.CharField(max_length=100)
    descricao = models.TextField()
    observacao = models.TextField()
    comidas = models.ManyToManyField(Comida, through='ComidaEvento')
    qtd_dias_evento = models.IntegerField(null=True, blank=True)
    local = models.ForeignKey(LocalEvento, on_delete=models.DO_NOTHING)
    data_inicio = models.DateField(null=True, blank=True)
    data_fim = models.DateField(null=True, blank=True)

    def save(self):
        dias = self.data_fim - self.data_inicio
        self.qtd_dias_evento = dias.days
        super(Evento, self).save()


class Logistica(models.Model):
    id_logistica = models.AutoField(primary_key=True)
    nome = models.CharField(max_length=200)
    descricao = models.TextField()
    valor = models.DecimalField(decimal_places=2, max_digits=6)
    dias = models.IntegerField()
    tipo = models.CharField(max_length=20, choices=listSelect.TIPO_LOGISTICA)
    evento_id = models.ForeignKey(Evento, on_delete=models.CASCADE, default=None)

    def __str__(self):
        return self.nome

Я решил проблему, мне пришлось рефакторить мой JavaScript, исправить файл views.py и создать набор форм для работы с формами views.py:

Мой HTML для формы (только форма логистики):

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