在无法子类化的Django模型中Page,我想将现有的ImageField转换为使用Wagtail图像。我将字段重新定义为:
avatar = models.ForeignKey(
'wagtailimages.Image', null=True, on_delete=models.SET_NULL, related_name='+'
)
Run Code Online (Sandbox Code Playgroud)
用户需要能够将图像上传到他们的个人资料视图。在Django视图的forms.py中,我有:
avatar = forms.ImageField(
label='Your Photo', required=False,
error_messages={'invalid': "Image files only"}, widget=forms.FileInput())
Run Code Online (Sandbox Code Playgroud)
当我将图像上传到视图时,它崩溃于:
Cannot assign "<InMemoryUploadedFile: filename.jpg (image/jpeg)>":
"UserProfile.avatar" must be a "Image" instance.
Run Code Online (Sandbox Code Playgroud)
我很确定问题出在表单中的字段定义上,但是我无法弄清楚正确的定义应该是什么。
我知道我需要手动将图像附加到UserProfile和Collection,但是需要首先克服此错误。还是尝试在非WT模型中使用各个WT字段是一个坏主意吗?谢谢。
这里的问题是avatar模型上的ForeignKey字段期望接收该wagtailimages.Image模型的实例。在ImageField窗体上是不能够提供此的-它只是提供了一个文件对象。为了使这项工作有效,您需要设置表单(我假设是ModelForm)以wagtailimages.Image与您自己的模型同时创建对象。应该可以使用以下自定义save方法执行此操作:
avatar = forms.ImageField为与“ avatar模型”字段不冲突的名称,例如avatar_imageavatar_image其包含在您的ModelForm的fields定义中,但avatar没有包含。此时,avatar_image只是表单上的一个额外字段,与模型没有任何关系。save在ModelForm上定义以下方法:
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
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |