[英]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.