如何在Django中创建具有许多关系的内联表单集

时间:2018-11-20 11:28:06

标签: django inline inline-formset

我想在预订模型和产品模型之间创建一个内联表单集。场景是,用户决定创建预购订单时将能够选择一个或多个产品。另一方面,可能在一个或多个预购中找到一种产品。考虑到这一点,我建立了许多关系。

models.py

class Preorder(models.Model):

    client = models.ForeignKey(Client,verbose_name=u'Client')
    invoice_date = models.DateField("Invoice date",null=True, blank=True, default=datetime.date.today)
    preorder_has_products = models.ManyToManyField(Product, blank=True)

    def get_absolute_url(self):
        return reverse('preorder_edit', kwargs={'pk': self.pk})


class Product(models.Model):

    name = models.CharField("Name",max_length=200)
    price = models.DecimalField("Price", max_digits=7, decimal_places=2, default=0)
    barcode = models.CharField(max_length=16, blank=True, default="")
    eopyy = models.CharField("Code eoppy",max_length=10, blank=True, default="")
    fpa = models.ForeignKey(FPA, null=True, blank=True, verbose_name=u'Fpa Scale')

forms.py

class PreorderForm(ModelForm):

    class Meta:
        model = Preorder
        exclude = ('client','preorder_has_products',)

    def __init__(self, *args, **kwargs):
        super(PreorderForm, self).__init__(*args,**kwargs)
        self.fields['invoice_date'].widget = MyDateInput(attrs={'class':'date'})

class ProductForm(ModelForm):
    #name = ModelChoiceField(required=True,queryset=Product.objects.all(),widget=autocomplete.ModelSelect2(url='name-autocomplete'))
    class Meta:
        model=Product
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        self.fields['name'].label="Name"
        self.fields['price'].label="Price"

最后是内联表单集:

PreorderProductFormSet = inlineformset_factory(Preorder, Product,
                                             form=ProductForm, extra=1)

运行后,我面临以下问题: ValueError位于/ “ intranet.Product”没有指向“ intranet.Preorder”的ForeignKey

自从我创建了很多关系以来,为什么会发生这种情况?

一种解决方案是在Product模型中在Preorder和Product模型之间创建外键关系。但是我不想这样做,因为产品模型用于我项目的其他区域,并且不想弄乱它。

有什么建议吗?

0 个答案:

没有答案