在无法子类化的 Django 模型中Page
,我想转换现有的 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.
我很确定问题出在表单中的字段定义,但我无法弄清楚正确的定义应该是什么。
我知道我需要手动将图像附加到用户配置文件和集合中,但需要首先解决此错误。或者尝试在非 WT 模型中使用单独的 WT 字段是一个坏主意吗?谢谢。
这里的问题是avatar
您的模型上的ForeignKey字段期望接收一个实例wagtailimages.Image
模型。这ImageField
表单上的 无法提供此功能 - 它仅提供一个文件对象。为了完成这项工作,您需要设置表单(我假设是 ModelForm)来创建wagtailimages.Image
与您自己的模型同时对象。应该可以通过自定义来做到这一点save
方法如下:
- Rename
avatar = forms.ImageField
与不冲突的东西avatar
模型字段,例如avatar_image
- 确保这件事
avatar_image
包含在您的 ModelForm 中fields
定义,但是avatar
不是。在此刻,avatar_image
只是表单上的一个额外字段,与模型没有任何联系。
-
定义以下内容save
ModelForm 上的方法:
from wagtail.images.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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)