我有一个跟踪项目的数据库。
每个项目可以具有与其关联的多个图像。
我的模型如下:
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。
我必须丢失一些东西,因为看起来这应该相对简单。
作为所引用链接的示例代码建议:...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
,您可能需要稍微不同的图像保存逻辑。并且可能是已经存在的图像的预览。