Создание нескольких объектов в одной форме django
Я работаю с этими моделями:
class Projects(models.Model):
id = models.AutoField
name = models.CharField(max_length=50, verbose_name='Название проекта')
customer_id = models.ForeignKey(Customers, verbose_name='Код заказчика', on_delete=models.CASCADE)
description = models.TextField(verbose_name='Описание', null=True)
date = models.DateField(auto_now_add=True, verbose_name='Дата заказа')
deadline = models.DateField(verbose_name='Дата дедлайна')
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='Проектирование', verbose_name='Статус выполнения')
curator = models.ForeignKey(Employees, verbose_name='Код куратора', on_delete=models.PROTECT, default=1)
budget = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Бюджет', null=True)
contract = models.FileField(null=True, verbose_name='Договор')
def __str__(self):
return self.name
class Services(models.Model):
id = models.AutoField
project_id = models.ForeignKey(Projects, verbose_name='Код проекта', on_delete=models.CASCADE)
name = models.CharField(max_length=50, verbose_name='Наименование услуги')
qty = models.PositiveIntegerField(default=1, verbose_name='Количество')
summ = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Сумма')
def __str__(self):
return "Услуги {} {}".format(self.name, self.qty)
У меня есть формы для них:
class ProjectForm(forms.ModelForm):
deadline = forms.DateInput()
class Meta:
model = Projects
fields = ('name', 'customer_id', 'description', 'deadline', 'status', 'curator')
widgets = {
'name': forms.TextInput(attrs={'class': 'modal_title_form'}),
'customer_id': forms.Select(attrs={'class': 'modal_customer_form'}),
'status': forms.Select(attrs={'class': 'modal_status_form'}),
'description': forms.Textarea(attrs={'class': 'modal_desc_form'}),
'curator': forms.Select(attrs={'class': 'modal_curator_form'}),
'deadline': forms.DateInput(format='%d-%m-%Y', attrs={'class': 'modal_deadline_form'})
}
class ServicesForm(forms.ModelForm):
class Meta:
model = Services
fields = ('name', 'qty', 'summ')
widgets = {
'name': forms.TextInput(attrs={'class': 'modal_service'}),
'summ': forms.NumberInput(attrs={'class': 'service_price_form'}),
'qty': forms.NumberInput(attrs={'class': 'counter'}),
}
Я открываю одну форму для создания одного проекта и это работает: в HTML
<form action="" method="POST">
{% csrf_token %}
<div id="myModal" class="modal">
<div class="modal-content">
<span class="close">×</span>
<div class="block modal_title_block">
<p class="label">Название</p>
{{ form.name }}
</div>
<div>
<div class="block modal_status_block">
<p class="label">Статус</p>
<br>
{{ form.status }}
</div>
<div class="block modal_customer_block">
<p class="label label-rigth">Заказчик</p>
<br>
{{ form.customer_id }}
</div>
</div>
<div>
<div class="block modal_curator_block">
<p class="label">Куратор</p>
<br>
{{ form.curator }}
</div>
<div class="block modal_deadline_block">
<p class="label label-rigth">Дедлайн</p>
<br>
{{ form.deadline }}
</div>
</div>
<div class="block modal_desc_block">
<p class="label">Описание</p>
{{ form.description }}
</div>
<div class="butt">
<input type="submit" class="save_project" value="Сохранить">
</div>
</div>
</div>
</form>
и в представлениях:
def add_project(request):
if request.method == 'POST':
form = ProjectForm(request.POST)
if form.is_valid():
form.save()
p_id = form.save()
request.session['id'] = p_id.id
id = request.session.get('id')
return render(request, 'add_services.html', {'id': id})
else:
form = ProjectForm()
return render(request, 'add_project.html', {'form': form})
Как вы видите, я хочу перейти на страницу "add_services", где я могу иметь несколько форм для создания множества Сервисов. И отправить ID созданного проекта, чтобы этот ID стал FK этого сервиса.
Хотелось бы, чтобы HTML выглядел так:
<form action="" method="POST">
{% csrf_token %}
<div id="myModal" class="modal">
<div class="modal-content">
<span class="close">×</span>
<div class="block modal_title_block">
<p class="modal_title">Добавить услуги к проекту</p>
</div>
<div>
<div class="block modal_service_block">
<p class="label">Услуга</p>
{{ multiforms.name }}
</div>
<div class="block modal_service_price">
<p class="label">Цена</p>
<br>
{{ multiforms.summ }}
</div>
<div class=" block modal_service_counter">
<p class="label">Количество</p>
<br>
{{ multiforms.qty }}
</div>
<div class="block modal_service_block">
<p class="label">Услуга</p>
{{ multiforms.name }}
</div>
<div class="block modal_service_price">
<p class="label">Цена</p>
<br>
{{ multiforms.summ }}
</div>
<div class=" block modal_service_counter">
<p class="label">Количество</p>
<br>
{{ multiforms.qty }}
</div>
<div class="butt">
<input type="submit" class="save_project" value="Сохранить">
</div>
</div>
</div>
</div>
</form>
и мнения о чем-то:
def multicreate(request, p_id):
if request.method == "POST":
multiforms = ServicesForm(request.POST)
project_id = p_id
name = request.data.get('name')
summ = request.data.get('summ')
qty = request.data.get('qty')
bulk_number = int(request.data.get('bulk_number'))
bulk_list = list()
for _ in range(bulk_number):
bulk_list.append(
Services(name=name, summ=summ, qty=qty, project_id=project_id))
Services.objects.bulk_create(bulk_list)
return redirect('base')
return render(request, "add_services.html", {"multiforms": multiforms})
В любом случае, я могу создать проект, он перенаправляет меня на add_services, но я не уверен, что он отправляет ID проекта, и, на самом деле, я запутался в мультиформах.
Я ищу любые идеи, потому что я не хочу создавать каждый сервис отдельно.