【问题标题】:django admin: save image like base64django admin:像base64一样保存图像
【发布时间】:2021-03-28 21:28:30
【问题描述】:

我想通过 django 管理面板上传图片,但我需要将其保存为数据库中的 base64 字符串 我怎么能做到? +

  1. 我想在管理员中查看图片
  2. DB 可能有一天会移动,最好只保存 base64 字符串,所以我不会依赖某些文件结构(好像我会在某处存储原始图像)

ps。我有 django 2.2.6 版本

【问题讨论】:

    标签: python django django-2.2


    【解决方案1】:

    将图像保存在数据库中被认为是一种不好的做法,最好使用 django-storages 并将图像保存到一些外部 S3 兼容的存储服务。

    如果您坚持您的方法:为了能够通过 Django 管理员上传图像并将它们存储为 base64,您需要在模型中使用 save 方法将图像编码为 b64 并将数据保存在字段中。比如:

    import base64
    
    
    class Image(models.Model):
        ...
        image_file = models.ImageField(upload_to='images/', default='blank.jpg')
        image_b64 = models.BinaryField(blank=True, null=True)
    
        def save(self, *args, **kwargs):
            if self.image_file:
                img_file = open(self.image_file.url, "rb")
                self.image_b64 = base64.b64encode(img_file.read())
                super(Image, self).save(*args, **kwargs)
    

    您可以在 Admin 上显示 ImageField,通过 admin.py 删除 Base64 字段。如果您想从 Base64 字段在 Admin 中显示它,那么您可以将其保存为添加标签的 html 字符串(也可以在 admin.py 中使用图像小部件设置该字段以显示它)。模型可能类似于:

    class Image(models.Model):
        ...
        image_file = models.ImageField(upload_to='images/', default='blank.jpg')
        image_b64 = models.TextField(blank=True)
    
        def save(self, *args, **kwargs):
            if self.image_file:
                img_file = open(self.image_file.url, "rb")
                data = base64.b64encode(img_file.read())
                self.image_b64 = format_html('<img src="data:;base64,{}">', data)
                super(Image, self).save(*args, **kwargs)
    

    【讨论】:

    • 谢谢!实际上下一个表格效果更好:self.default_image_bs64 = base64.b64encode(self.default_image_file.read())
    猜你喜欢
    • 2016-03-11
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多