Создание единых форм по двум моделям в Django с помощью динамических полей

Я хочу создать Django Forms для сохранения транзакций для магазина. Мне нужен конечный шаблон, похожий на этот. ER-диаграмма для моей базы данных также показана на картинке.

HTML tempalte and ER Diagram

Моими моделями Django являются:

class Party(models.Model):
    party_id = models.BigAutoField(primary_key=True)
    party_name = models.CharField(max_length=128)
    party_phone = models.CharField(max_length=128)
    party_address = models.CharField(max_length=128)

    def __str__(self):
        return self.party_name

class Items(models.Model):
    item_no = models.BigAutoField(primary_key=True)
    item_type = models.BooleanField(default=True)    
    item_name = models.CharField(max_length=128) 
    item_qty = models.PositiveIntegerField(default=0)
    item_cost = models.PositiveIntegerField(default=0)
    
    def __str__(self):
        return self.item_name

class Sales(models.Model):
    invoice_no = models.BigAutoField(primary_key=True)
    invoice_date = models.DateField(default=date.today)
    party = models.ForeignKey(Party, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.invoice_no)

class SalesTransaction(models.Model):
    sales = models.ForeignKey(Sales, on_delete=models.CASCADE)
    items = models.ForeignKey(Items, on_delete=models.CASCADE)
    purchase_qty = models.PositiveIntegerField(default=0)
    total_cost = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.item_name

Я могу достичь этого с помощью AJAX, но я не думаю, что это лучшее решение, потому что много валидаций должны быть сделаны с жестким кодированием.

Как я могу создать Django Form для сохранения данных в нескольких таблицах в один клик сохранения?

Недавно я искал способ сделать то же самое. Решение, на которое я наткнулся, заключается в использовании двух объектов формы под одним тегом <form>. Вы можете различать объекты формы, присваивая им атрибуты prefix перед передачей в контекст. Например:

def get_view(request):
    ....
    form1 = Form1(prefix="form1")
    form2 = Form2(prefix="form2")
    return render(request, 'template.html', {'form1': form1, 'form2': form2})

В вашем шаблоне вы будете вызывать их как обычно в одном теге формы:

<form>
    {{ form1.as_p }}
    {{ form2.as_p }}
    <input type='submit'>
</form>

Теперь в представлении поста вы можете использовать префикс для получения данных каждой формы по отдельности:

def post_view(request):
    form1 = Form1(request.POST, prefix="form1")
    form2 = Form2(request.POST, prefix="form2")
    ....
Вернуться на верх