Изменение размера изображения при загрузке с подушкой с использованием ModelForm - PullRequest
0 голосов
/ 05 сентября 2018

Эй, у меня есть следующий код, но он не возвращает ошибки, но размер изображения не изменяется, в начале он был 6,2 МБ, а после выполнения кода он такой же:

Моя модель:

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}) 

my Model.Form

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',)

Мои views.py

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 МБ, что немного.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Если вам нужен пакет, в котором сохраняются изображения с другим размером и меткой, которые вы определили, вы можете использовать пакет django-stdimage и использовать их как:

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>
0 голосов
/ 05 сентября 2018

Вы можете использовать метод изменения размера вместо эскиза, например так:

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
...