Поле ImageField
Поле ImageField является подклассом FileField и предназначено для загрузки и хранения изображений. Оно наследует всю функциональность файлового поля, добавляя возможность проверки соответствия загружаемых файлов форматам изображений. Для работы с этим полем требуется установка библиотеки PIL (Pillow), которая обеспечивает обработку изображений. Поле хранит путь к файлу в базе данных, а само изображение сохраняется в файловой системе согласно настройкам медиа-файлов.
При создании модели с полем ImageField необходимо указать параметр upload_to, который определяет директорию для сохранения загружаемых изображений. Дополнительно можно указать параметры height_field и width_field для автоматического сохранения размеров изображения, а также max_length для ограничения длины пути к файлу.
Синтаксис
image = models.ImageField(upload_to='path/to/upload', **options)
Пример
Давайте создадим модель для хранения изображений продуктов с возможностью автоматического определения их размеров:
from 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
Теперь создадим экземпляр модели и сохраним изображение:
from 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}")
Результат выполнения кода:
"/media/products/phone.jpg"
"Width: 1200, Height: 800"
Пример
Рассмотрим работу с полем ImageField при использовании в форме для загрузки изображений через веб-интерфейс:
from 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 проверяет, что загруженный файл является корректным изображением.
Пример
Покажем, как можно получить информацию о загруженном изображении и выполнить его обработку:
from 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")
Результат выполнения кода:
"Image format: JPEG"
"Image size: (1200, 800)"
"Image mode: RGB"
"Thumbnail created successfully"