从wagtail外面上传Wagtail图像

时间:2017-03-02 00:35:08

标签: django wagtail

在不能继承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字段是一个坏主意?感谢。

1 个答案:

答案 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