在不能继承Page
的Django模型中,我想将现有的ImageField转换为使用Wagtail图像。我已将该字段重新定义为:
avatar = models.ForeignKey(
'wagtailimages.Image', null=True, on_delete=models.SET_NULL, related_name='+'
)
用户需要能够将图片上传到他们的个人资料视图。在Django视图的forms.py中,我有:
avatar = forms.ImageField(
label='Your Photo', required=False,
error_messages={'invalid': "Image files only"}, widget=forms.FileInput())
当我将图像上传到视图时,它会崩溃:
Cannot assign "<InMemoryUploadedFile: filename.jpg (image/jpeg)>":
"UserProfile.avatar" must be a "Image" instance.
我很确定问题是表单中的字段定义,但我无法弄清楚正确的定义应该是什么。
我知道我需要手动将图像附加到UserProfile和Collection,但需要首先解决此错误。或者在非WT模型中尝试使用单个WT字段是一个坏主意?感谢。
答案 0 :(得分:5)
这里的问题是模型上的avatar
ForeignKey字段期望接收wagtailimages.Image
模型的实例。表单上的ImageField
无法提供此功能 - 它只提供文件对象。为了完成这项工作,您需要设置表单(我假设它是一个ModelForm),以便与您自己的模型同时创建wagtailimages.Image
对象。应该可以使用自定义save
方法执行此操作,如下所示:
avatar = forms.ImageField
重命名为与avatar
模型字段不会发生冲突的内容,例如avatar_image
avatar_image
包含在您的ModelForm的fields
定义中,但avatar
不是。{1}}。此时,avatar_image
只是表单上的一个额外字段,与模型没有任何关联。在ModelForm上定义以下save
方法:
from wagtailimages.models import Image
def save(self, commit=False):
if not commit:
raise Exception("This form doesn't support save(commit=False)")
# build the instance for this form, but don't save it to the db yet
instance = super(MyForm, self).save(commit=False)
# create the Image object
avatar = Image.objects.create(
file=self.cleaned_data['avatar_image'],
title="Image title"
# you may need to add more fields such as collection to make it a valid image...
)
# attach the image to your final model, and save
instance.avatar = avatar
instance.save()
return instance