Создание единых форм по двум моделям в Django с помощью динамических полей
Я хочу создать Django Forms для сохранения транзакций для магазина. Мне нужен конечный шаблон, похожий на этот. ER-диаграмма для моей базы данных также показана на картинке.
Моими моделями 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")
....
