从Django中的验证函数内部修改数据是否合法?我需要自动调整来自ImageFields
的图片。
在文档中,它说这些函数应该引发ValidationError
,但我需要实际修改数据(在这种情况下为image
)。我想这样做,因为我必须将它应用于几个模型。如果我能做到这一点,我就不需要更改管理员中的表单。
def image_field_autoresize(image):
if image.width > MAX_IMAGE_WIDTH:
raise ValidationError(u'image width error')
if image.height > MAX_IMAGE_HEIGHT:
raise ValidationError(u'image height error')
答案 0 :(得分:2)
在与@karthikr讨论后,我可以得出以下结论:
如果您需要在验证过程中更改数据,可以从clean_<fieldname>()
类重写ModelForm
。在clean()
中的ModelForm
方法中,您不应该这样做。如果你需要做一些图像大小调整,我发现最好的地方是模型的save()
方法。
我已经解决了这个问题:
我创建了一个名为image.py
的新模块,其中包含一个函数,该函数将图像的绝对路径作为参数,实现调整大小逻辑并修改图像大小。就我而言,如果宽度大于给定尺寸,“调整大小逻辑”会按比例缩小图像。
from PIL import Image
from django.conf import settings
def autoresize_image(image_path):
image = Image.open(image_path)
width = image.size[0]
if width > settings.IMAGE_MAX_WIDTH:
height = image.size[1]
reduce_factor = settings.IMAGE_MAX_WIDTH / float(width)
reduced_width = int(width * reduce_factor)
reduced_height = int(height * reduce_factor)
image = image.resize((reduced_width, reduced_height), Image.ANTIALIAS)
image.save(image_path)
我从模型中的save()
方法调用此函数,该方法包含要调整大小的ImageField
。这里要记住要点:在尝试调整图片大小之前调用super()
,否则将无法找到它,因为它不会保存在您的硬盘中,如果不需要ImageField
,请检查如果给出了价值。它看起来像:
def save(self, *args, **kwargs):
super(Startup, self).save(*args, **kwargs)
if self.logo:
autoresize_image(self.logo.path)
感谢@Jingo以及他的评论。这非常有用:)