Как в django models.ImageField как получить размеры изображения

21 сентября 2026

В Django получить размеры изображения из ImageField можно двумя основными способами: на лету через встроенные свойства или автоматически сохраняя их в базу данных для экономии ресурсов.

Способ 1. На лету (через свойства .width и .height)
Поле ImageField возвращает объект ImageFieldFile, который уже имеет встроенные свойства для получения ширины и высоты. Django использует библиотеку Pillow под капотом для их чтения.
 
# Получение размеров в представлении (views.py) или шаблоне
my_model_instance = MyModel.objects.get(id=1)
# Ширина и высота в пикселях
width = my_model_instance.image.width
height = my_model_instance.image.height

 

В шаблоне HTML это можно вывести так:

<p>Размер: {{ object.image.width }}x{{ object.image.height }}px</p>

Минус метода: Если файл хранится во внешнем хранилище (например, AWS S3), обращение к .width или .height может спровоцировать повторное скачивание файла или отправку запроса для чтения метаданных, что замедлит работу.

Способ 2. Автоматическое сохранение в БД (Рекомендуемый)

Чтобы не читать файл каждый раз, Django умеет автоматически записывать ширину и высоту в базу данных при загрузке картинки. Для этого используются аргументы width_field и height_field.

from django.db import models

class Photo(models.Model):
    title = models.CharField(max_length=100)
    image = models.ImageField(
        upload_to='photos/', 
        width_field='image_width',   # Связываем с полем ширины
        height_field='image_height'  # Связываем с полем высоты
    )
    # Поля для хранения размеров (заполняются автоматически)
    image_width = models.PositiveIntegerField(null=True, blank=True)
    image_height = models.PositiveIntegerField(null=True, blank=True)

 

При сохранении объекта Django сам определит размеры и запишет их в image_width и image_height. Вы сможете мгновенно получать их без обращения к самому файлу:

photo = Photo.objects.first()
print(photo.image_width)  # Быстрый запрос из БД

В шаблонах Django (templates) получить размеры картинки очень просто. Выбор синтаксиса зависит от того, какой способ из предыдущего ответа вы настроили в своих моделях.

Вот варианты вывода размеров прямо в HTML-коде:

Вариант 1. Если вы используете width_field и height_field (Рекомендуемый)
Если в модели настроено автоматическое сохранение размеров в базу данных, вы просто обращаетесь к этим полям напрямую через объект. Это самый быстрый способ, так как Django берет готовые числа из БД.
 
{# Предположим, что объект в контексте называется 'photo' #}
<div class="image-container">
    <img src="{{ photo.image.url }}" 
         width="{{ photo.image_width }}" 
         height="{{ photo.image_height }}" 
         alt="{{ photo.title }}">
    
    <p>Разрешение: {{ photo.image_width }}x{{ photo.image_height }} пикселей</p>
</div>
 
Вариант 2. На лету через свойства ImageField
Если вы не создавали отдельные поля в базе данных, вы можете вызвать встроенные свойства .width и .height самого файла. Django автоматически определит их.
 
<div class="image-container">
    <img src="{{ photo.image.url }}" 
         width="{{ photo.image.width }}" 
         height="{{ photo.image_height }}" 
         alt="{{ photo.title }}">
    
    <p>Разрешение: {{ photo.image.width }}x{{ photo.image.height }} px</p>
</div>

Используйте этот вариант с осторожностью, если ваши медиа-файлы хранятся в облаке (например, в AWS S3). При каждом рендеринге страницы Django может отправлять запросы к облаку, чтобы прочитать метаданные картинки, что сильно замедлит загрузку сайта.

Полезный совет для верстки
Передавать width и height в тег <img> очень полезно для SEO и производительности (это предотвращает сдвиги контента Layout Shift при загрузке страницы). Если вы хотите, чтобы картинка была адаптивной, вы можете задать эти атрибуты для браузера, а в CSS ограничить их:
 
<img src="{{ photo.image.url }}" 
     width="{{ photo.image.width }}" 
     height="{{ photo.image_height }}" 
     style="max-width: 100%; height: auto;">