【问题标题】:Programatically adding an image to Wagtail from one's local machine以编程方式从本地机器向 Wagtail 添加图像
【发布时间】:2020-08-20 17:25:12
【问题描述】:

我正在尝试使用manage.py 命令将图像添加到我的 Wagtail 网站上的模型。我找到了this post that covers it,但它使用 requests.get() 调用来自互联网的图像。我将图像保存在本地,但尝试调整链接代码失败:

from django.core.files.images import ImageFile
from wagtail.images.models import Image

path = f"{img_directory}/{filename}"
img_bytes = open(path, "rb").read()
img_file = ImageFile(BytesIO(img_bytes), name=filename)
img_obj = Image(title=filename, file=img_file)
print(img_obj.file)
img_obj.save()

print(img_obj.file) 语句确实打印了定义的文件名,但是当我尝试调用 img_obj.save() 时,出现以下错误:

django.db.utils.IntegrityError: NOT NULL constraint failed: wagtailimages_image.width

我猜我打开文件有误,它没有像我想要的那样将它作为图像读取,但我不知道我到底哪里出错了。

【问题讨论】:

  • 我无法测试,但 ImageField 本质上只是 MEDIA_PATH 中的一个路径。因此,从技术上讲,您可以将文件复制到那里,然后将 img_obj.file.path 设置为它所在的位置。然后您可以手动设置img_obj.file.widthimg_obj.file.height。但是,您可能对它无法正常工作是正确的,因为它无法正确读取图像文件。

标签: python django wagtail


【解决方案1】:

https://github.com/wagtail/wagtail/blob/40aedfc66b6605d1ece80c15ec38b37f028082a8/wagtail/images/fields.py#L97

你可能会这样做:

import willow
from django.core.files.images import ImageFile
from wagtail.images.models import Image

path = f"{img_directory}/{filename}"
img_bytes = open(path, "rb").read()
img_file = ImageFile(BytesIO(img_bytes), name=filename)

im = willow.Image.open(path)
width, height = im.get_size()

img_obj = Image(title=filename, file=img_file, width=width, height=height)
print(img_obj.file)
img_obj.save()

【讨论】:

  • 这让我找到了解决问题的正确途径,感谢您的回复!
  • 是的,我担心这只是一个提示,而不是完整的解决方案。我很高兴听到它有帮助。我不能很快看到 Wagtail 在上传时在哪里以及如何做等效的,但离这个不远了。
猜你喜欢
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 2018-03-24
相关资源
最近更新 更多