[英]Alter uploaded image before saving with Django admin models
我有一個 Django model 可以保存圖像。 但是,在我保存 model 之前,我想檢查寬度和高度並創建圖像的 md5 hash 以檢查重復上傳。
我沒有使用任何自定義 forms 我只是想使用管理后端上傳一些圖像。
我正在使用 Django==3.0.5 和 Python 3.8.2
這是我的 model:
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)
但是,我在任何地方都找不到如何訪問以表單發送的文件。 我怎樣才能訪問這些?
像這樣,
class UploadedImage(models.Model):
# your code
def save(self, *args, **kwargs):
if not self.pk: self.image # the image will be here # access any class variables using `self` member
super(UploadedImage, self).save(*args, **kwargs)
這里的語句, if not self.pk
非常重要,因為它用於識別save
操作是否正在處理新的 object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.