【发布时间】:2020-04-29 14:07:21
【问题描述】:
我有一个保存图像的 Django 模型。但是,在我保存模型之前,我想检查宽度和高度并创建图像的 md5 哈希以检查重复上传。
我没有使用任何自定义表单,我只是尝试使用管理后端上传一些图片。
我正在使用 Django==3.0.5 和 Python 3.8.2
这是我的模型:
from django.db import models
from hashlib import md5
from PIL import Image
from io import BytesIO
class UploadedImage(models.Model):
"""An image upload
Arguments:
models {[type]} -- [description]
"""
name = models.CharField(max_length=255, default='')
pub_date = models.DateTimeField(auto_now=True)
image = models.ImageField(upload_to='images/')
height = models.IntegerField(default=0)
width = models.IntegerField(default=0)
extension = models.CharField(max_length=20, null=False, default='')
hash = models.CharField(max_length=50, null=False, unique=True, db_column='hash', default='')
def __str__(self):
return self.name
@staticmethod
def hash_exists(hash):
return UploadedImage.objects.exists(hash=hash)
def generate_name(self):
img_id = UploadedImage.objects.values('id').order_by('-id').first()['id'] + 1
self.name = "%s_%s" % (img_id, self.hash[-4:])
def save(self, *args, **kwargs):
# get the actual image???????
# img = self.request.FILES['image'] ????
if img:
self.hash = md5(img).hexdigest()
try:
if hash_exists(self.hash):
raise ValueError("image hash already exists, duplicate image!")
except ValueError as err:
print(err.args)
return err
img = Image.open(BytesIO(img))
self.width, self.height = img.size
self.extension = img.format.lower()
self.generate_name()
else:
print("no image")
return ""
super(UploadedImage, self).save(*args, **kwargs)
但是,我在任何地方都找不到如何访问表单中发送的文件。 我怎样才能访问这些?
【问题讨论】:
标签: python django python-imaging-library