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
就这样。发布问题后,我找到了答案。
愚蠢的我。
基本上,我在上面发布的代码有效。
问题是我创建了一个新模型,所以从技术上讲它是空的,所以我无法在我的下拉列表中找到它们。
我已经部分实现了表单集 + 发票和库存模型的多对多关系功能。
我的问题是表格没有显示可用的库存(即使它们存在)。 在这里查看问题: 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
就这样。发布问题后,我找到了答案。 愚蠢的我。
基本上,我在上面发布的代码有效。 问题是我创建了一个新模型,所以从技术上讲它是空的,所以我无法在我的下拉列表中找到它们。