我有自定义clean_*
表单方法,可以验证上传的图像类型和文件扩展名。
class TableModelForm(ModelForm):
def clean_image(self):
img_err = 'Unsupport image type. Please upload png, jpg or gif.'
img_formats = ['png', 'jpeg', 'gif']
img = self.cleaned_data.get('image')
if not img:
return img
img_fmt = img.image.format.lower()
img_ext = splitext(img.name)[1][1:].lower()
if any([x not in img_formats for x in [img_fmt, img_ext]]):
raise ValidationError(ugettext_lazy(img_err), code='invalid_image')
return img
在尝试上传相应格式但没有文件扩展名的图片之前,它会正常运行,在这种情况下,default_validator
会启动,我会看到默认的FileExtensionValidator
错误消息:
File extension '' is not allowed. Allowed extensions are: 'bmp, bufr, cur, pcx, dcx, dds, ps, eps, fit, fits, fli, flc, fpx, ftc, ftu, gbr, gif, grib, h5, hdf, png, jp2, j2k, jpc, jpf, jpx, j2c, icns, ico, im, iim, tif, tiff, jfif, jpe, jpg, jpeg, mic, mpg, mpeg, mpo, msp, palm, pcd, pdf, pxr, pbm, pgm, ppm, psd, bw, rgb, rgba, sgi, ras, tga, webp, wmf, emf, xbm, xpm'.
有没有办法在不重新声明字段的情况下替换default_validator
字段的ModelForm
?
答案 0 :(得分:1)
我会尝试将字段validators
设置为表单__init__
方法中的空列表。
class TableModelForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['image'].validators = []
另一个选项可能是继承ImageField
并更改default_validators
,然后在模型表单中使用自定义字段。
我不太熟悉文件字段和图像字段的内部,所以我不确定这两种方法是否都能正常工作。