Объект Django / Python ‘int’ не подлежит подписке

#python #django

#python #django

Вопрос:

в моих моделях.py я получил класс с именем Post, а ImageField — postcover. Я хочу сохранить каждое изображение в формате PNG, который пока работает нормально, но я понятия не имею, как я мог бы сохранить фактическое соотношение сторон изображения после обработки изображения.

при следующем решении я получаю следующую ошибку:

объект ‘int’ не поддается подписке

models.py

 class Post(models.Model):
...
postcover = fields.ImageField(
        verbose_name="Post Cover",
        blank=True,
        null=True,
        upload_to=get_file_path_user_uploads,
        validators=[default_image_size, default_image_file_extension]
    )
...
def save(self, *args, **kwargs):
    super(Post, self).save(*args, **kwargs)
    if self.postcover:
        if os.path.exists(self.postcover.path):
            imageTemproary = Image.open(self.postcover)
            outputIoStream = BytesIO()
            baseheight = 500
            hpercent = (baseheight / float(self.postcover.size[1]))
            wsize = int((float(self.postcover.size[0]) * float(hpercent)))
            imageTemproaryResized = imageTemproary.resize((wsize, baseheight))
            imageTemproaryResized.save(outputIoStream, format='PNG')
            outputIoStream.seek(0)
            self.postcover = InMemoryUploadedFile(outputIoStream, 'ImageField',
                                                  "%s.png" % self.postcover.name.split('.')[0], 'image/png',
                                                  sys.getsizeof(outputIoStream), None)
    super(Post, self).save(*args, **kwargs)
  

полная трассировка:

  Internal Server Error: /post/2/edit/
 Traceback (most recent call last):
   File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
     response = get_response(request)
   File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
     response = self.process_exception_by_middleware(e, request)
   File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
     response = wrapped_callback(request, *callback_args, **callback_kwargs)
   File "/app/app_Accounts/decorators.py", line 33, in _wrapped_view
     return view_func(request, *args, **kwargs)
   File "/usr/local/lib/python3.6/site-packages/ratelimit/decorators.py", line 30, in _wrapped
     return fn(*args, **kw)
   File "/app/app/views.py", line 473, in post_edit
     post.save()
   File "/app/app/models.py", line 204, in save
     hpercent = (baseheight / float(self.postcover.size[1]))
 TypeError: 'int' object is not subscriptable
  

Заранее спасибо за помощь 🙂

Комментарии:

1. Пожалуйста, укажите полную обратную трассировку исключения; в веб-представлении для этого есть ссылка «только текст».

2. И что self.postcover здесь? Является ли это файловым объектом? Если это так, то .size не может быть размера изображения (кортеж с шириной и высотой), возможно, вы имели в виду использовать imageTemproary.size вместо этого?

3. Только что добавлена полная трассировка

4. И да, это файловый объект

5. Тогда self.postcover.size это не кортеж. Это размер файла в байтах. Используйте imageTemproary.size .

Ответ №1:

Вы пытаетесь обработать размер файла как кортеж с шириной и высотой. Вы хотите использовать imageTemproary.size вместо этого, не self.postcover.size :

 hpercent = baseheight / imageTemproary.size[1]
wsize = int(imageTemproary.size[0] * hpercent)
  

Я также упростил код, вы используете Python 3, где / выдает значение с плавающей запятой, даже если оба входных значения являются целыми числами (истинное деление, а не деление по этажам).

Возможно, вы захотите исправить написание переменной объекта image ( imageTemporary ); лично я бы просто использовал image .