1

I am trying to place two independent forms on one template.

I have them placed but there is a problem that both forms are being checked.

Validation of both forms is being checked. Although I only have one button clicked in the first form. How can I split these two forms so that they are independent? I need the form to be checked separately.

Separately - the first and second forms. When I fill out one form - I get an error because both forms are being checked.

How can I separate the forms - separate the forms during checking. How can I split the two forms so that only one of the two forms in the template is processed?

enter image description here

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> 

1 Answer 1

0

You might need to assign a unique name or identifier to each submit button in your template:

<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> 

Upon submitting a form, you can check request.POST['form_type'] in your view to determine which form was submitted and handle each form separately:

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) 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.