从w外部上传Wa图像

sha*_*ker 3 django wagtail

在无法子类化的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字段是一个坏主意吗?谢谢。

gas*_*man 6

这里的问题是avatar模型上的ForeignKey字段期望接收该wagtailimages.Image模型的实例。在ImageField窗体上是不能够提供此的-它只是提供了一个文件对象。为了使这项工作有效,您需要设置表单(我假设是ModelForm)以wagtailimages.Image与您自己的模型同时创建对象。应该可以使用以下自定义save方法执行此操作:

  • 重命名avatar = forms.ImageField为与“ avatar模型”字段不冲突的名称,例如avatar_image
  • 确保将avatar_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)