Поле ImageField

Поле ImageField является подклассом FileField и предназначено для загрузки и хранения изображений. Оно наследует всю функциональность файлового поля, добавляя возможность проверки соответствия загружаемых файлов форматам изображений. Для работы с этим полем требуется установка библиотеки PIL (Pillow), которая обеспечивает обработку изображений. Поле хранит путь к файлу в базе данных, а само изображение сохраняется в файловой системе согласно настройкам медиа-файлов.

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

Синтаксис

pythonimage = models.ImageField(upload_to='path/to/upload', **options)

Пример

Давайте создадим модель для хранения изображений продуктов с возможностью автоматического определения их размеров:

pythonfrom django.db import models

class Product(models.Model):
  name = models.CharField(max_length=200)
  description = models.TextField()
  image = models.ImageField(
    upload_to='products/',
    height_field='image_height',
    width_field='image_width',
    max_length=255
  )
  image_height = models.PositiveIntegerField(blank=True, null=True)
  image_width = models.PositiveIntegerField(blank=True, null=True)
  created_at = models.DateTimeField(auto_now_add=True)
  
  def __str__(self):
    return self.name

Теперь создадим экземпляр модели и сохраним изображение:

pythonfrom myapp.models import Product
from django.core.files import File

product = Product(name='Smartphone X', description='High-end smartphone')

with open('/tmp/phone.jpg', 'rb') as f:
  product.image.save('phone.jpg', File(f), save=True)

print(product.image.url)
print(f"Width: {product.image_width}, Height: {product.image_height}")

Результат выполнения кода:

python"/media/products/phone.jpg"
"Width: 1200, Height: 800"

Пример

Рассмотрим работу с полем ImageField при использовании в форме для загрузки изображений через веб-интерфейс:

pythonfrom django import forms
from myapp.models import Product

class ProductForm(forms.ModelForm):
  class Meta:
    model = Product
    fields = ['name', 'description', 'image']
    widgets = {
      'image': forms.FileInput(attrs={'accept': 'image/*'}),
    }
    
def save_product_from_form(request):
  if request.method == 'POST':
    form = ProductForm(request.POST, request.FILES)
    if form.is_valid():
      product = form.save(commit=False)
      # Перед сохранением можно выполнить дополнительную обработку
      if product.image:
        print(f"Saving image: {product.image.name}")
      product.save()
      return product
  return None

В этом примере форма автоматически обрабатывает загруженное изображение и сохраняет его в указанную директорию. При этом Django проверяет, что загруженный файл является корректным изображением.

Пример

Покажем, как можно получить информацию о загруженном изображении и выполнить его обработку:

pythonfrom myapp.models import Product
from PIL import Image
import io

# Получаем продукт с изображением
product = Product.objects.first()
if product and product.image:
  # Открываем изображение
  img = Image.open(product.image.path)
  print(f"Image format: {img.format}")
  print(f"Image size: {img.size}")
  print(f"Image mode: {img.mode}")
  
  # Создаем миниатюру
  thumb = img.copy()
  thumb.thumbnail((200, 200))
  thumb.save(product.image.path.replace('.jpg', '_thumb.jpg'))
  print("Thumbnail created successfully")

Результат выполнения кода:

python"Image format: JPEG"
"Image size: (1200, 800)"
"Image mode: RGB"
"Thumbnail created successfully"

Смотрите также

  • поле FileField,
    которое является базовым полем для хранения файлов
  • поле CharField,
    которое хранит строковые значения в базе данных
  • поле TextField,
    которое предназначено для хранения больших текстов
  • поле URLField,
    которое используется для хранения URL-адресов