Как сохранять изображения с уникальными именами в Django?

В Django существует несколько способов сохранения изображений с уникальными именами. Один из самых распространенных подходов - использование модуля uuid, который генерирует уникальные идентификаторы.

Начнем с определения модели, которая будет отвечать за хранение изображений. Для этого используется класс models.Model из Django:

from django.db import models
import uuid

def upload_to(instance, filename):
    ext = filename.split('.')[-1]
    filename = f'{uuid.uuid4()}.{ext}'
    return 'images/' + filename

class Image(models.Model):
    image = models.ImageField(upload_to=upload_to)

В коде выше мы определяем модель Image с полем image, которое является экземпляром класса ImageField. Ключевой аргумент upload_to указывает, куда будут сохраняться загруженные изображения. Мы передаем функцию upload_to, которая будет генерировать уникальные имена для каждого загруженного изображения.

Функция upload_to принимает два аргумента: instance (экземпляр модели) и filename (оригинальное имя файла). Мы используем модуль uuid для генерации уникального идентификатора, а затем добавляем его к расширению файла.

Затем вам нужно обработать загрузку файлов в представлении Django. Представление может выглядеть примерно так:

from django.shortcuts import render
from .forms import ImageForm

def upload_image(request):
    if request.method == 'POST':
        form = ImageForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('success')
    else:
        form = ImageForm()
    return render(request, 'upload.html', {'form': form})

В данном представлении мы используем класс ImageForm, который следует создать в отдельном файле forms.py. В ImageForm мы просто указываем, что полем формы является поле image модели Image:

from django import forms
from .models import Image

class ImageForm(forms.ModelForm):
    class Meta:
        model = Image
        fields = ('image',)

В шаблоне upload.html вы можете добавить форму загрузки изображения:

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Upload</button>
</form>

После того как изображение будет загружено и сохранено, вы можете получить доступ к нему в других частях приложения, используя атрибут image модели Image:

def my_view(request, image_id):
    image = Image.objects.get(id=image_id)
    image_path = image.image.url
    # Делаем что-то с image_path

Обратите внимание, что для работы с изображениями Django использует MEDIA_ROOT и MEDIA_URL, которые нужно правильно настроить в файле настроек settings.py.