gpt4 book ai didi

django - 从 wagtail 外部上传 Wagtail 图像

转载 作者:行者123 更新时间:2023-12-01 23:24:51 25 4
gpt4 key购买 nike

在无法子类 Page 的 Django 模型中,我想将现有 ImageField 转换为使用 Wagtail 图像。我已将该字段重新定义为:

avatar = models.ForeignKey(
'wagtailimages.Image', null=True, on_delete=models.SET_NULL, related_name='+'
)

用户需要能够将图像上传到他们的个人资料 View 。在 Django View 的 forms.py 中,我有:

avatar = forms.ImageField(
label='Your Photo', required=False,
error_messages={'invalid': "Image files only"}, widget=forms.FileInput())

当我将图像上传到 View 时,它崩溃了:

Cannot assign "<InMemoryUploadedFile: filename.jpg (image/jpeg)>":
"UserProfile.avatar" must be a "Image" instance.

我很确定问题出在表单中的字段定义,但我无法弄清楚正确的定义应该是什么。

我知道我需要手动将图像附加到用户配置文件和集合中,但需要首先解决此错误。或者尝试在非 WT 模型中使用单独的 WT 字段是一个坏主意吗?谢谢。

最佳答案

这里的问题是模型上的avatarForeignKey字段期望接收wagtailimages.Image模型的实例。表单上的 ImageField 无法提供此功能 - 它仅提供一个文件对象。要实现此功能,您需要设置表单(我假设是 ModelForm)以在创建您自己的模型的同时创建 wagtailimages.Image 对象。应该可以使用自定义 save 方法来执行此操作,如下所示:

  • avatar = forms.ImageField 重命名为不与 avatar 模型字段冲突的名称,例如 avatar_image
  • 确保 avatar_image 包含在 ModelForm 的 fields 定义中,但 avatar 不包含。此时,avatar_image 只是表单上的一个额外字段,与模型没有任何连接。
  • 在 ModelForm 上定义以下 save 方法:

    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

关于django - 从 wagtail 外部上传 Wagtail 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42544797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com