带有 M2M 字段的 Django InlineFormset

问题描述

我找到了一种方法来处理作为外键相互连接的模型形式。

我正在寻找一个表单集,该表单集将创建一个相互之间具有 M2M 关系的动态表单,因此请遵循以下设计:

class PrescriptionLine(models.Model):
    id = models.AutoField(primary_key=True)
    drug = models.ForeignKey(Drug,on_delete=models.CASCADE)
    morning = models.FloatField(choices=[(val,val) for val in TABLET_INTAKE_QTY],default=0,blank=True,null=True)
 
class Prescription(models.Model):
    id = models.AutoField(primary_key=True)
    patient = models.ForeignKey(Patient,on_delete=models.CASCADE)
    line_prescription = models.ManyToManyField(PrescriptionLine,on_delete=models.CASCADE)
    note = models.TextField(max_length=100,default='')

现在我可以这样做:

PrescriptionFormset = inlineformset_factory(
    Prescription,PrescriptionLine,form=PrescriptionForm,fields=['drug','morning'],extra=1,can_delete=True
    )

但我不能这样做,因为它说 PrescriptionLine 没有 ForeignKey to Prescription。

这是怎么做到的?请帮助我为此苦苦挣扎了好几个月。如果需要,表单集本身已经准备好了,我可以在这里添加吗?

解决方法

所以解决方案其实很简单。到目前为止,我没有遵循它(意味着更新尚未经过测试),这是有效的:

SinglePrescriptionFormset = modelformset_factory(
    PrescriptionLine,form=PrescriptionLineForm,fields='__all__',extra=1,can_delete=True
    )

上面的错误有一个错误请注意:

    line_prescription = models.ManyToManyField(PrescriptionLine)

它以这种方式工作,无需更改任何其他内容。