我已经用发票和库存模型部分实现了表单集+多对多关系功能。
我的问题是表单没有显示可用的库存(即使它们存在(。请在此处查看问题:https://www.dropbox.com/s/mtqkfee2pisyh5a/dj005_formset_many_to_many_relationship_working.jpg?dl=0
这是工作代码:
# MODELS.PY
class Invoice_Test_M2M(models.Model):
id = models.BigAutoField(primary_key=True)
ref_num = models.CharField(max_length=100)
def __str__(self):
return self.ref_num
class Inventory_Test_M2M(models.Model):
id = models.BigAutoField(primary_key=True)
inventory_name = models.CharField(blank=True, max_length=100)
invoice = models.ManyToManyField('Invoice_Test_M2M', through= "Invoice_Inventory_Through")
def __str__(self):
return self.inventory_name
class Invoice_Inventory_Through(models.Model):
invoice = models.ForeignKey(Invoice_Test_M2M, on_delete=models.CASCADE)
inventory = models.ForeignKey(Inventory_Test_M2M, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=9, decimal_places=2, blank=True, null=True)
quantity = models.DecimalField(max_digits=9, decimal_places=2, blank=True, null=True)
amount = models.DecimalField(max_digits=9, decimal_places=2, blank=True, null=True)
# FORMS.PY
Inventory_TestLineItem_M2M_Formset = inlineformset_factory(Invoice_Test_M2M, Invoice_Inventory_Through, fields = '__all__', exclude=[], can_delete=True)
# VIEWS.PY
class Invoice_M2M_CreateView(CreateView):
model = Invoice_Test_M2M
fields = '__all__'
def get_context_data(self, **kwargs):
context = super(Invoice_M2M_CreateView, self).get_context_data(**kwargs)
if self.request.POST:
context['track_formset'] = Inventory_TestLineItem_M2M_Formset(self.request.POST)
else:
context['track_formset'] = Inventory_TestLineItem_M2M_Formset()
return context
def form_valid(self, form):
context = self.get_context_data(form=form)
formset = context['track_formset']
if formset.is_valid():
response = super().form_valid(form)
formset.instance = self.object
formset.save()
return response
else:
return super().form_invalid(form)
有办法绕过这个吗?
PS有趣的是,如果我只是使用伪多对多模型(即使用外部字段而不是多对多字段(。它有效。
你可以在这里看到它的工作原理:https://www.dropbox.com/s/32x84k8roa88jvf/dj005_formset_many_to_many_relationship_working_B.jpg?dl=0
那么为什么不使用这种方法呢?主要原因是M2M有一个内置的API来显示其相关成员(即显示特定发票的库存(。在上面的方法中,我觉得我必须手动完成。
p.p.S.相关烟囱溢流柱。我已经实施了解决方案,但我仍然遇到同样的问题:
多对多关系的挂件到内联表单集
访问多对多";通过";Formsets 中的关系字段
就是这样。张贴问题后,我找到了答案。愚蠢的我。
基本上,我在上面发布的代码是有效的。问题是,我创建了一个新模型,所以从技术上讲,它是空的,所以我在下拉列表中找不到它们。