【问题标题】:Django - Converting a Binary stream to an ImageDjango - 将二进制流转换为图像
【发布时间】:2020-05-04 04:07:51
【问题描述】:

我正在尝试从 url 获取图像并将其返回给 ModelAdmin 以将其显示在表格的新列中。

我在 admin.py 文件中尝试了以下代码:

def new_field(self, obj): r = requests.get('https://abcd.com/image') return r.content

代码没有给我任何错误,但它返回的是一个长二进制字符串而不是图像本身。

如何传递图像本身,或将二进制内容转换为图像?

【问题讨论】:

    标签: django python-3.x django-admin


    【解决方案1】:

    如果你不会只显示它,你不需要下载图像。

    def new_field(self, obj):
        url = 'https://abcd.com/image'
        return '<img src="{}" />'.format(url)
    
    new_field.allow_tags = True # it is important!!!
    
    

    【讨论】:

    • 谢谢你,但问题是它显示了整个字符串`
    • 应该可以。请显示您的 ModelAdmin 类的完整代码
    • 实际上,当我使用 mark_safe 函数时,它运行良好。我正在使用 Django 3.x 也许这就是它不起作用的原因。但感谢您向我展示如何实际获取图像并返回它。我不知道它可以这么直截了当。
    【解决方案2】:

    您可以在此处使用NamedTemporaryFile [GitHub]。例如:

    from django.core.files import File
    from django.core.files.temp import NamedTemporaryFile
    
    def store_image_from_source(self, obj):
        img = NamedTemporaryFile()
        r = requests.get('https://abcd.com/image')
        img.write(r.content)
        img.flush()
        file = File(img)
        obj.my_img_attr.save('filename.jpeg', file, save=True)

    因此'filename.jpeg' 是文件的名称,就好像您将使用该名称上传一个带有ModelForm 的文件一样。

    【讨论】:

    • 我的意思不是实际保存任何图像。它只是从 url 获取它并通过设置新字段的值将其传递给管理模板。有没有更好的方法来实现这一目标?我是 Django 的新手,所以请原谅我的基本问题。
    • @Alladin:问题是 Django 只提供静态/媒体文件,甚至只在开发中。对于生产,它根本不提供此类文件。然后你需要配置 nginx/apache/...
    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 2015-08-27
    • 2012-02-07
    • 2017-12-22
    • 2012-12-15
    • 1970-01-01
    • 2012-05-26
    • 2013-08-13
    相关资源
    最近更新 更多