使用动态字段在 Django 中通过两个模型创建单个表单

Create Single Forms by Two Models in Django with Dynamic Fields

我想创建 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> 标记下使用两个表单对象。您可以通过在传递给上下文之前给它们 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>

现在在您的 post 视图中,您可以使用前缀分别获取每个表单的数据:

def post_view(request):
    form1 = Form1(request.POST, prefix="form1")
    form2 = Form2(request.POST, prefix="form2")
    ....