django admin:像base64一样保存图像

django admin: save image like base64

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

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

ps。我有 django 2.2.6 版本

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

如果你坚持你的方法:为了能够通过 Django 管理上传图像并将它们存储为 base64,你需要在你的模型中使用一个保存方法将你的图像编码为 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 字段。如果你想在 Admin 的 Base64 字段中显示它,那么你可以将它保存为 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)