Как правильно отправить две формы в одной HTML-структуре?
Я пытаюсь отправить представление create с двумя формами. Приведенный ниже код работает нормально, если все заполнено и форма отправлена. Однако если в форме2 опущены поля... отправка формы не происходит и поле, которое было заполнено для "формы"... "имя".... сбрасывается. Я читал, что можно сделать несколько форм, и в целом у меня это работает... мне просто нужно понять, как включить форму2 в if_valid()..... Вот мой вид...
def tasklist_detail_view(request, id):
context = {}
context["tasklist"] = TaskList.objects.get(id=id)
context["tasks"] = Task.objects.filter(task_list=id).all()
obj = get_object_or_404(TaskList, id=id)
form = UpdateTaskListForm(request.POST or None, instance=obj)
form2 = TaskForm(request.POST or None)
context["task_list_id"] = id
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse("MyTaskLists:my_task_list_main_menu"))
context["form"] = form
context["form2"] = form2
return render(request, "my_task_list_tasklist_detail.html", context)
Мой HTML...
<form method="POST" enctype="multipart/form-data" id="forms">
{% csrf_token %}
{{ form.name }}
{% include "my_task_list_task_create_form1.html" with tasklist=tasklist %}
<button type="submit" class="button66" name="status" value="Submitted">Submit</button>
</form>
А затем в моем include HTML...
<div id="task-list-form" hx-target="this" hx-swap="outerHTML">
<button class="button35" hx-post="{% url 'MyTaskLists:task-create' id=task_list_id %}">Save</button>
{{ form2 }}
Я пытался сделать что-то вроде....
if form.is_valid() and form2.is_valid():
form.save()
return HttpResponseRedirect(reverse("MyTaskLists:my_task_list_main_menu"))
Но потом ничего не происходит... формы не принимаются вообще, даже если поля заполнены правильно.... Из того, что я прочитал, я понял, что POST применяется к обеим формам.... если одна не заполнена правильно, поэтому другая выдает ошибку? Я просто не могу понять, как правильно обработать их обе.
Заранее спасибо за любые мысли.
Если вы хотите, чтобы две формы вели себя как одна форма, и сохраняли два объекта только в том случае, если обе формы действительны, то логика такова
if form.is_valid() and form2.is_valid():
form.save()
form2.save()
return HttpResponseRedirect(reverse("MyTaskLists:my_task_list_main_menu"))
context["form"] = form
context["form2"] = form2
return render(request, "my_task_list_tasklist_detail.html", context)
Если в form и form2 есть поле с одинаковым именем, необходимо использовать префикс, чтобы устранить двусмысленность.
form = UpdateTaskListForm(request.POST or None, instance=obj, prefix='form1')
form2 = TaskForm(request.POST or None, prefix='form2')