0

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

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

我的模型如下所示:

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 的文档有一些关于如何在此处处理多个文件上传的信息,这是我获得上述图像字段代码的地方,但示例代码似乎根本不了解模型。如果正在编辑的表单在 CreateView 中,并且 Item 还不存在,我可以在 post() 代码中创建 ItemImage 对象,但我没有与之关联的 Item。

我一定遗漏了一些东西,因为看起来这应该相对简单。

4

1 回答 1

1

正如引用链接中的示例代码所建议的那样:...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您可能需要一些不同的图像保存逻辑。并且可能是已经存在的图像的预览。

基于类的视图的好 API-Doc

于 2019-12-26T22:14:07.927 回答