繁体   English   中英

前端的三级内联表单集

[英]Three-level inline formsets in the frontend

我正在尝试在 Django 中完成一个三级堆叠内联表单。假设这些模型:

class Anuncio(models.Model):
    title = models.CharField(max_length=200)
    delivery = models.CharField(max_length=100)

class Product(models.Model):
    anuncio = models.ForeignKey(Anuncio, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    quantity = models.PositiveIntegerField(default=1)
    price = models.PositiveIntegerField()

class Image(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    image = models.ImageField()

有一个关系Anuncio-Product和另一个关系Product-Image 有了这个 Django package ,我在 Django 管理员中完成了我想要的:在创建Anuncio object 时,我可以添加任意数量的Product ,而这些产品可以有任意数量的Image 我正在尝试在前端完成此操作。

我认为通往 go 的方法是使用 Django 表单集,但我遇到了一些问题。 我在网上找到的所有资源都只是“两级”表单集,或者在“三级”情况下,所有外键都指向同一个父级 model。

使用这个forms.py文件:

class ProductForm(ModelForm):
    class Meta: 
        model = Product 
        fields = ['name', 'quantity', 'price']

class ImageForm(ModelForm):
    class Meta: 
        model = Imagen 
        fields = ['image']

class AnuncioForm(ModelForm):
    class Meta: 
        model = Anuncio 
        fields = ['title', 'delivery']

而这个views.py function:

def anunciocreateview(request):
 form = AnuncioForm(request.POST or None)
 ProductFormSet = inlineformset_factory(Anuncio, Product, form=ProductForm)
 ImageFormSet = inlineformset_factory(Product, Image, form=ImageForm)
 if all([form.is_valid(), ProductFormSet.is_valid(), ImageFormSet.is_valid()]):
     parent = form.save(commit=False)
     parent.anunciante = request.user
     parent.save()
     for form in ProductoFormSet:
         child = form.save(commit=False)
         child.anuncio = parent 
         child.save()
     for form in ImagenFormSet:
         imagen = form.save(commit=False)
         imagen.product = form.product
         imagen.save()
  context = {
     'form_1' : form,
     'form_2' : ProductFormSet,
     'form_3' : ImageFormSet,
    }

但是我认为在添加模型之间的正确关系时我遗漏了重要的一点。 此设置给出的AttributeError为: 'ProductForm' object has no attribute '__name__'

例如,出现在 AdminStackedInLine 中的“添加(额外)产品”我想它可以通过 JavaScript 来完成,使用隐藏的 forms 并更改点击事件的属性。

任何人都有做类似事情的经验或可以指导我正确的方向吗? 还有如何管理提交的forms的数据和关系?

我认为您的问题是您尝试验证 class 表单而不是实例化您的表单集并验证它们。 您的代码看起来像这样:

def anunciocreateview(request):
  ProductFormSet = inlineformset_factory(Anuncio, Product, form=ProductForm)
  ImageFormSet = inlineformset_factory(Product, Image, form=ImageForm)

  anuncio_form = AnuncioForm(request.POST or None)
  product_formset = ProductFormSet(request.POST or None)
  image_formset = ImageFormSet(request.POST or None)
  if all([form.is_valid(), product_formset.is_valid(), image_formset.is_valid()]):
    ...

function inlineformset_factory只是创建了一个Form class,不是form的实例。

有关文档的更多信息和示例: https://docs.djangoproject.com/fr/4.1/topics/forms/formsets/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM