Как я могу разделить две формы таким образом, чтобы обрабатывалась только одна из двух форм в шаблоне?
Я пытаюсь разместить две независимые формы в одном шаблоне.
Я разместил их, но есть проблема в том, что проверяются обе формы.
Проверяется валидность обеих форм. Хотя в первой форме я нажал только одну кнопку. Как я могу разделить эти две формы, чтобы они были независимыми? Мне нужно, чтобы форма проверялась отдельно.
Отдельно - первая и вторая формы. Когда я заполняю одну форму - я получаю сообщение об ошибке, потому что проверяются обе формы.
Как я могу разделить формы - разделяйте формы во время проверки. Как я могу разделить две формы так, чтобы обрабатывалась только одна из двух форм в шаблоне?
введите описание изображения здесь
views.py:
def book(request, pk):
context = {}
Category_pk_for_form_maim.objects.all().delete()
filter_qs_category = Category_pk_for_form_category.objects.filter(name_object=pk)
filter_qs_category = filter_qs_category.values("category_name")
for item in filter_qs_category:
entry = item
new_entry = Category_pk_for_form_maim(categoty_name=entry)
new_entry.save()
form_category_1 = Category_pk_for_form_category_Form(request.POST or None)
form_2 = Form_GPR(request.POST or None)
if request.method == 'POST':
if "form_category_1" in request.POST:
if form_category_1.is_valid():
model_instance = form_category_1.save(commit=False)
name_object = pk
category_name = model_instance.category_name
new_entry = Category_pk_for_form_category(name_object=name_object, category_name=category_name)
new_entry.save()
return redirect("book-detail", pk)
if "form_2" in request.POST:
if form_2.is_valid():
model_instance = form_2.save(commit=False)
name_object = pk
name_working = model_instance.name_working
type_izm = model_instance.type_izm
value_work = model_instance.value_work
lyudi_norma = model_instance.lyudi_norma
technik_norma = model_instance.technik_norma
date_begin = model_instance.date_begin
date_end = model_instance.date_end
new_entry = CreateNewGPR(name_object=name_object, name_working=name_working, type_izm=type_izm, value_work=value_work, lyudi_norma=lyudi_norma, technik_norma=technik_norma, date_begin=date_begin, date_end=date_end)
new_entry.save()
return redirect("book-detail", pk)
context['form_category_1'] = form_category_1
context['form_2'] = form_2
""" Gets an individual book object from the database, based on its ID/PK. Renders a detail template """
book = get_object_or_404(ArkiObject_1, pk=pk)
filter_qs = CreateNewGPR.objects.filter(name_object=pk)
filter_qs = filter_qs.values("name_working", "type_izm", "value_work", "lyudi_norma", "technik_norma", "date_begin", "date_end")
context['books'] = filter_qs
return render(request, 'bookdetail.html', context)
forms.py:
class Form_GPR (forms.ModelForm):
class Meta:
model = CreateNewGPR
fields = "name_category", "name_working", "type_izm", "value_work", "lyudi_norma", "technik_norma", "date_begin", "date_end"
widgets = {
"name_category": forms.RadioSelect(attrs={"type":"radio"}),
"date_begin": forms.DateInput(attrs={"class":"form-control", "type":"date"}),
"date_end": forms.DateInput(attrs={"class":"form-control", "type":"date"}),
}
class Form_Working (forms.ModelForm):
class Meta:
model = CreateNewWorkDayForms
fields = "name_working", "second_name_working", "third_name_working", "value_work_fact", "lyudi_fact", "technik_fact", "date_day"
widgets = {
"date_day": forms.DateInput(attrs={"class":"form-control", "type":"date"}),
"name_working": forms.RadioSelect(attrs={"type":"radio"}),
}
class Category_pk_for_form_category_Form (forms.ModelForm):
class Meta:
model = Category_pk_for_form_category
fields = "category_name",
class FilterForm(forms.Form):
name = forms.CharField()
models.py:
lass Category_pk_for_form_maim (models.Model):
categoty_name = models.CharField()
def __str__(self):
return self.categoty_name
class Category_pk_for_form_category (models.Model):
name_object = models.IntegerField(verbose_name="Наименование объекта")
category_name = models.CharField()
class CreateNewGPR (models.Model):
name_object = models.IntegerField(verbose_name="Наименование объекта")
name_category = models.ForeignKey(Category_pk_for_form_maim, default=0, on_delete=models.CASCADE, verbose_name="Наименование категории/раздела/вида работ")
name_working = models.CharField(verbose_name="Наименование работы")
type_izm = models.CharField(choices=TYPE_IZMERENIYA, verbose_name="Единицы измерения")
value_work = models.FloatField(verbose_name="Объём работ")
lyudi_norma = models.IntegerField(verbose_name="Нормативные затраты персонала")
technik_norma = models.IntegerField(verbose_name="Нормативные затраты техники")
date_begin = models.DateField(verbose_name="Дата начала работ")
date_end = models.DateField(verbose_name="Дата окончания работ")
class GPRWorkingName (models.Model):
name_working = models.CharField(verbose_name="Наименование работы по ГПР")
def __str__(self):
return self.name_working
bookdetail.html:
{% load widget_tweaks %}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>title</title>
</head>
<body>
<div>
<h4>Выбрать категорию / раздел / вид работ для составления графика</h4>
<h4>Если отсутствует необходимое название в меню выбора то добавьте в форме ниже</h4>
</div>
<br/>
<hr/>
<div>
<form method="POST" class="post-form">
{% csrf_token %}
<input type="hidden" name="form_name" value="form1">
{{form_category_1.as_p}}
<button type="submit" class="button">Отправить</button>
</form>
</div>
<br/>
<div>
<form method="POST" class="post-form">
{% csrf_token %}
<input type="hidden" name="form_name" value="form2">
{{form_2.as_p}}
<button type="submit" class="button">Отправить</button>
</form>
</div>
<br/>
<div>
<table>
<thead>
<tr>
<th>Наименование работы</th>
<th>Единицы измерения</th>
<th>Объём работ</th>
<th>Нормативные затраты персонала</th>
<th>Нормативные затраты техники</th>
<th>Дата начала работ</th>
<th>Дата окончания работ</th>
</tr>
</thead>
<tbody>
{% for book in books %}
<tr>
<td>{{ book.name_working }}</td>
<td>{{ book.type_izm }}</td>
<td>{{ book.value_work }}</td>
<td>{{ book.lyudi_norma }}</td>
<td>{{ book.technik_norma }}</td>
<td>{{ book.date_begin }}</td>
<td>{{ book.date_end }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>
Возможно, вам потребуется присвоить уникальное имя или идентификатор каждой кнопке отправки в вашем шаблоне:
<form method="post">
{% csrf_token %}
{{ form1.as_p }}
<button type="submit" name="form_type" value="form1">Submit Form 1</button>
</form>
<form method="post">
{% csrf_token %}
{{ form2.as_p }}
<button type="submit" name="form_type" value="form2">Submit Form 2</button>
</form>
После отправки формы вы можете проверить request.POST['form_type'] в вашем представлении, чтобы определить, какая форма была отправлена, и обработать каждую форму отдельно:
def my_view(request):
form1 = Form1()
form2 = Form2()
if request.method == 'POST':
if request.POST.get('form_type') == 'form1':
form1 = Form1(request.POST)
if form1.is_valid():
# Handle form1 data
...
elif request.POST.get('form_type') == 'form2':
form2 = Form2(request.POST)
if form2.is_valid():
# Handle form2 data
...
context = {'form1': form1, 'form2': form2}
return render(request, 'your_template.html', context)