删除单个相关文件 - Django

时间:2015-10-07 10:42:18

标签: django django-models django-forms

我有一个django modelformset,它执行以下操作:

添加页面

  • 为'product'添加模型实例
  • 模型相关(ForeignKey)到 用于将多张图片添加到产品实例的“产品”。

编辑页面

  • 表单集也位于编辑页面上,预先填充了“产品”实例及其相关图像。

这是问题,当我将多个图片上传到产品时,我希望能够从编辑页面中删除所选图像(保留其余部分)。

如何将单个图像 - 它在数据库中的位置及其在文件系统上的位置 - 传递给某种删除方法?在一个理想的世界中,我希望通过某种方式实现这一目标AJAX方法,但我可以从哪里开始?

查看编辑内容

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, 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())

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

次要内容 - 如何在模板中实际显示已上传到产品的图片?目前,图像仅显示为预先填充的formset的额外实例(url to image file)。

模板用于编辑......

<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
    <table> 
            <p> {{ product_form.as_ul }}</p>

                <p> current images </p>     

                {% for product in product.images.all %}
                <img src="{{ product.image.url }}" alt="...">
                {% endfor %}
                <br> <p> break </p>

            {{ formset.management_form }}
            {% for form in formset %}
            {{ form }}
            {% endfor %}
    </table>

    <input type="submit" value="Confirm Changes">

1 个答案:

答案 0 :(得分:0)

经过长时间的搜索后,我通过自定义函数找到了way to delete individual images

如果您想要显示与产品相关的图像,我找到了几种方法:如果您想在表单中显示图像,则可以使用modify the FileField widget ...

我所做的是通过将第二个查询集更改为queryset=ProductImage.objects.none())来删除预先填充表单的上传图像,然后我将pictures = ProductImage.objects.filter(product_id = pk)添加到视图中,然后在模板中循环显示它们。

希望这有助于某人。