由错误数据填充的Formset - Django 1.8

时间:2015-10-13 10:29:00

标签: django django-forms django-views

基本问题:我有一个产品列表,当我去编辑单个产品时,图像上传表单集中填充了文件夹中的所有图像,但它只应填充相关图像(参见左侧) (见下图)。

当我尝试对产品或图像进行任何更改时,它不成功,现在显示由不相关图像填充的输入框'此字段是必需的' (见下图右侧)

django formset populated with wrong data

显然,我需要成功编辑产品对象,并且我希望此页面仅由与该产品相关的图像填充。

视图

def EditProduct(request, pk):
    instance = get_object_or_404(Product, id=pk)
    ImageFormSet = modelformset_factory(ProductImage,
                                        form=ImageForm, extra=4)

    if request.method == 'POST':
        product_form = AddEditProductForm(request.POST, request.FILES, instance=instance)
        formset = ImageFormSet(request.POST, request.FILES,
                        queryset=ProductImage.objects.none())

        if product_form.is_valid() and formset.is_valid():

            product = product_form.save()

            images = formset.save(commit=False)
            for image in images:
                image.product = product
                image.save()
            return HttpResponseRedirect('/product/')

        else:
            print (product_form.errors, formset.errors)

    else:
        product_form = AddEditProductForm(instance=instance)
        formset = ImageFormSet(queryset=ProductImage.objects.all()) # possible wrong queryset

    return render(request, 'product/edit.html',
                  {'product_form': product_form, 'formset': formset},
                  context_instance=RequestContext(request))

因此,此代码以某种方式将我上传的所有图像(包括不相关的图像)返回到单个产品的编辑表单 - 我如何制作它以便只有那些与实例相关的图像才会显示在表单中?< / p>

在相关的说明中 - 如何访问formset中的单个图像 - 例如,如果我想删除一个图像,我在看什么样的修改?

1 个答案:

答案 0 :(得分:1)

这取决于您的型号。

formset = ImageFormSet(queryset=ProductImage.objects.all()) # possible wrong queryset

这确实是错误的查询集。你应该做点什么:

queryset=ProductImage.objects.filter(product_id = pk)

如果您为product_image字段指定了related_name而不是

queryset=instance.related_product_images

https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.ForeignKey.related_name