Создание нескольких объектов в одной форме 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">&times;</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">&times;</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 проекта, и, на самом деле, я запутался в мультиформах.

Я ищу любые идеи, потому что я не хочу создавать каждый сервис отдельно.

Вернуться на верх