gpt4 book ai didi

python - 图像字段模型形式的 Django 自定义验证(最大文件大小等)

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:25 24 4
gpt4 key购买 nike

我有一个模型,它有一个名为“横幅”的图像字段,我正在尝试验证文件大小和尺寸,如果图像太大则提供错误。

这是模型.py:

class Server(models.Model):
id = models.AutoField("ID", primary_key=True, editable=False)
servername = models.CharField("Server Name", max_length=20)
ip = models.CharField("IP Address", max_length=50)
port = models.CharField("Port", max_length=5, default='25565')
banner = models.ImageField("Banner", upload_to='banners', max_length=100)
description = models.TextField("Description", blank=True, max_length=3000)
rank = models.IntegerField(default=0)
votes = models.IntegerField(default=0)
website = models.URLField("Website URL", max_length=200, blank=True)
user = models.ForeignKey(User)
motd = models.CharField("MOTD", max_length=150, default='n/a')
playersonline = models.CharField("Online Players", max_length=7, default='n/a')
online = models.BooleanField("Online", default=False)
sponsored = models.BooleanField("Sponsored", default=False)
lastquery = models.DateTimeField('Last Queried', auto_now=True)
slugurl = models.SlugField("SlugURL", max_length=50)
def __unicode__(self):
return "%s (%s:%s)" % (self.servername, self.ip, self.port)

这是带有自定义验证的 forms.py:

class AddServer(ModelForm):
class Meta:
model = Server
fields = ('servername', 'ip', 'port', 'website', 'description', 'banner')

# Add some custom validation to our image field
def clean_image(self):
image = self.cleaned_data.get('banner', False)
if image:
if image._size > 1*1024*1024:
raise ValidationError("Image file too large ( maximum 1mb )")
if image._height > 60 or image._width > 468:
raise ValidationError("Image dimensions too large ( maximum 468x60 pixels )")
return image
else:
raise ValidationError("Couldn't read uploaded image")

根据我的阅读,这应该可行,但无论大小,图像都会上传。

我做错了什么还是有更好的方法来做这件事?

最佳答案

方法名应该是clean_<field name> , 在这种情况下 clean_banner .

为了将来引用,我将放置一段我在最近的项目中使用的代码(名称必须适应 OP 代码):

from PIL import Image
from django.utils.translation import ugettext as _

def clean_photo(self):
image = self.cleaned_data.get('photo', False)

if image:
img = Image.open(image)
w, h = img.size

#validate dimensions
max_width = max_height = 500
if w > max_width or h > max_height:
raise forms.ValidationError(
_('Please use an image that is smaller or equal to '
'%s x %s pixels.' % (max_width, max_height)))

#validate content type
main, sub = image.content_type.split('/')
if not (main == 'image' and sub.lower() in ['jpeg', 'pjpeg', 'png', 'jpg']):
raise forms.ValidationError(_('Please use a JPEG or PNG image.'))

#validate file size
if len(image) > (1 * 1024 * 1024):
raise forms.ValidationError(_('Image file too large ( maximum 1mb )'))
else:
raise forms.ValidationError(_("Couldn't read uploaded image"))
return image

关于python - 图像字段模型形式的 Django 自定义验证(最大文件大小等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12129677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com