Django 使用ModelForm与枕头一起上载时调整图像大小
嘿,我有一个以下代码,但它没有返回错误,但图像没有被调整大小,开始时是6.2MB,运行代码后是相同的: 我的模型:Django 使用ModelForm与枕头一起上载时调整图像大小,django,django-forms,django-rest-framework,Django,Django Forms,Django Rest Framework,嘿,我有一个以下代码,但它没有返回错误,但图像没有被调整大小,开始时是6.2MB,运行代码后是相同的: 我的模型: class Photo(models.Model): user_name= models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True) photo= models.ImageField() photo_name= models.TextField(max_length=30
class Photo(models.Model):
user_name= models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
photo= models.ImageField()
photo_name= models.TextField(max_length=300)
def __str__(self):
return self.photo_name
def get_absolute_url(self):
return reverse('photo:add_photo',{'pk':self.pk})
我的模型,表格
class PhotoForm(ModelForm):
def clean_image(self):
img = self.cleaned_data.get('photo')
if not img:
return img
maxdim = 1024
if any(dim > maxdim for dim in img.image.size):
# Resize too large image up to the max_size
i = Image.open(img.file)
fmt = i.format.lower()
i.thumbnail((maxdim, maxdim))
# We must reset io.BytesIO object, otherwise resized image bytes
# will get appended to the original image
img.file = type(img.file)()
i.save(img.file, fmt)
return img
class Meta:
model = Photo
exclude= ('user_name',)
我的观点
class PhotoCreateView(View):
form_class = PhotoForm
template_name = 'photo/photo_form.html'
def get(self,request):
form = self.form_class(None)
return render(request,self.template_name,{'form': form})
def post(self,request):
form = self.form_class(request.POST, request.FILES)
if form.is_valid():
return redirect('travel:main')
return render(request, self.template_name,{})
任何人都知道为什么它不会返回错误,但图像的大小仍然相同。我想在pythonanywhere.com上托管的应用程序上上载我的图像,它们的存储空间限制为512 MB,这并不多。您可以使用调整大小的方法,而不是像这样使用缩略图:
def clean_image(self):
img = self.cleaned_data.get('photo')
if not img:
return img
maxdim = 1024
if any(dim > maxdim for dim in img.image.size):
# Resize too large image up to the max_size
i = Image.open(img.file)
img = i.resize((maxdim, maxdim), Image.ANTIALIAS)
img.save(image/file/path)
return img
如果您想要一个可以保存不同大小和标签的图像的软件包,您可以使用
django stdimage
package并像以下那样使用它们:
models.py:
image = StdImageField(upload_to=upload_to, blank=True, variations={
'large': (600, 400),
'thumbnail': (100, 100, True),
'medium': (300, 200),
})
some.html:
<a href="{{ object.myimage.url }}"><img src="{{ object.myimage.thumbnail.url }}"/></a>
1024x1024
不是很小,是吗?是的,我试过更小的尺寸,但也没用。我主要关心图片的大小,我的主要目标是在不损失大部分质量的情况下压缩图片PhotoForm调用clean_image如何?你的意思是清洁照片吗?