В Django получить размеры изображения из ImageField можно двумя основными способами: на лету через встроенные свойства или автоматически сохраняя их в базу данных для экономии ресурсов.
.width и .height)ImageField возвращает объект ImageFieldFile, который уже имеет встроенные свойства для получения ширины и высоты. Django использует библиотеку Pillow под капотом для их чтения.my_model_instance = MyModel.objects.get(id=1)
width = my_model_instance.image.width
height = my_model_instance.image.height
В шаблоне HTML это можно вывести так:
Минус метода: Если файл хранится во внешнем хранилище (например, AWS S3), обращение к .width или .height может спровоцировать повторное скачивание файла или отправку запроса для чтения метаданных, что замедлит работу.
Способ 2. Автоматическое сохранение в БД (Рекомендуемый)
Чтобы не читать файл каждый раз, Django умеет автоматически записывать ширину и высоту в базу данных при загрузке картинки. Для этого используются аргументы width_field и height_field.
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. Вы сможете мгновенно получать их без обращения к самому файлу:
print(photo.image_width) # Быстрый запрос из БД
В шаблонах Django (templates) получить размеры картинки очень просто. Выбор синтаксиса зависит от того, какой способ из предыдущего ответа вы настроили в своих моделях.
Вот варианты вывода размеров прямо в HTML-коде:
width_field и height_field (Рекомендуемый)<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>
ImageField.width и .height самого файла. Django автоматически определит их.<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 ограничить их:width="{{ photo.image.width }}"
height="{{ photo.image_height }}"
style="max-width: 100%; height: auto;">