【问题标题】:Django point ImageField to an already existing imageDjango 将 ImageField 指向一个已经存在的图像
【发布时间】:2016-06-18 01:38:40
【问题描述】:

我有一个具有 Image 字段的模型:

class Foo(models.Model):
    image = models.ImageField(upload_to = "bar", blank = True)

我正在使用 urllib 通过互联网下载图像,如下所示:

urllib.urlretrieve(img_url, img_path)

现在我想将图像字段指向保存为 img_path 的下载图像。我曾尝试使用PIL 中的Image.open() 首先打开文件并指向它,然后使用django.core.files.File 指向它并使用obj.image.save(File(open(file_path))),但它们似乎不起作用。是否有替代方法来实现这一点?

【问题讨论】:

    标签: python django python-2.7 django-models


    【解决方案1】:

    您可以简单地将image 字段设置为新路径并保存对象:

    obj.image = img_path
    obj.save()
    

    编辑:

    请注意,img_path 必须与您的 MEDIA_ROOT 设置相关。

    【讨论】:

    • 几乎完美。只需要稍作调整。我已经用那个调整写了一个答案。谢谢! :)
    【解决方案2】:

    ImageFieldFile.save 将文件名作为第一个参数。

    试试这个:

    from PIL import Image
    im = Image.open(file_path)
    save_file_path = get_the_image_upload_to(obj)
    obj.image.save(save_file_path, im)
    

    不确定im 是否足够,或者您是否应该执行以下操作:

    from io import BytesIO
    
    from PIL import Image
    
    im = Image.open(file_path)
    save_file_path = get_the_image_upload_to(obj)
    file_io = BytesIO()
    im.save(file_io)
    file_io.seek(0)
    obj.image.save(save_file_path, file_io.read())
    

    【讨论】:

    • 我之前确实尝试过第一个,但没有运气。虽然,通过另一个答案,我发现只需稍作调整,您就可以直接指定图像的路径。我已经写了一个带有必要调整的答案。谢谢你的帮助! :)
    【解决方案3】:

    稍微修改ilse2005's 答案。我发现直接设置路径有效。该路径必须相对于您的媒体根目录,并且它的作用就像一个魅力。

    所以根据这个定义,这段代码绝对完美:

    obj.image = os.path.join('bar', img_name)
    obj.save()
    

    【讨论】:

    • 我这样做是因为它进行了最终修复,如果它很重要,我将撤销答案接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2010-11-05
    • 2012-11-19
    • 2011-12-15
    • 2013-02-13
    • 2022-12-07
    • 2015-05-24
    相关资源
    最近更新 更多