Formsets + 多对多关系问题

Formsets + Many to Many Relationship Problem

我已经部分实现了表单集 + 发票和库存模型的多对多关系功能。

我的问题是表格没有显示可用的库存(即使它们存在)。 在这里查看问题: 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。相关 Whosebug post。我已经实施了解决方案,但我仍然遇到同样的问题:

pendant to inline formsets for many-to-many relations

Accessing Many to Many "through" relation fields in Formsets

就这样。发布问题后,我找到了答案。 愚蠢的我。

基本上,我在上面发布的代码有效。 问题是我创建了一个新模型,所以从技术上讲它是空的,所以我无法在我的下拉列表中找到它们。