如何在Django中处理多文件输入字段

问题描述 投票:0回答:1

我有一个跟踪项目的数据库。

每个项目可以具有与其关联的多个图像。

我的模型如下:

class Item(models.Model):
    name = ...
    price = ...
    description = ...

class ItemImage(models.Model):
    item = models.ForeignKey("Item", on_delete=models.CASCADE, related_name="images")

在尝试将图像字段添加到每个项目之前,我的视图如下所示:

class ItemAdd(CreateView):
    model = Item
    fields = ['name', 'price', 'description']
    ...

class ItemEdit(UpdateView):
    model = Item
    fields = ['name', 'price', 'description']
    ...

为了添加图像字段,我将视图更改为这样:

class ItemAdd(CreateView):
    model = Item
    form_class = ItemEditForm
    ...

class ItemEdit(UpdateView):
    model = Item
    form_class = ItemEditForm
    ...

并创建此表单:

class ItemEditForm(forms.ModelForm):
    images = forms.ImageField(required=False, widget=forms.ClearableFileInput(attrs={'multiple': True}))

    class Meta:
        model = Item
        fields = ('name', 'price', 'description')

这会将文件输入字段添加到我的模板中,但实际上对用户选择的图像没有任何作用。

Django的文档提供了有关如何处理多个文件上载here的一些信息,这是我获得上述图像字段代码的地方,但是示例代码似乎根本不了解模型。如果正在编辑的表单位于CreateView中,而Item还不存在,则可以在post()代码中创建ItemImage对象,但没有与之关联的Item。

我必须丢失一些东西,因为看起来这应该相对简单。

python django python-3.x
1个回答
0
投票

作为所引用链接的示例代码建议:...Then override the post method of your FormView...-您需要为视图中的图像添加保存逻辑

对于基于类的CreateView,这是在form_valid()中完成的:

class ItemAdd(CreateView):
    model = Item
    form_class = ItemEditForm
    ...

    def form_valid(self, form):
        self.object = form.save() # create Item first
        images = self.request.FILES.getlist('images')
        for image in images:
            self.object.images.create(image=image)
        return HttpResponseRedirect(self.get_success_url())

对于UpdateView,您可能需要稍微不同的图像保存逻辑。并且可能是已经存在的图像的预览。

Nice API-Doc on Class-Based Views

© www.soinside.com 2019 - 2024. All rights reserved.