Как управлять несколькими наборами форм в 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 для формы (только форма логистики):