Чтобы изменить название картинки, которое Django дает ей по умолчанию при загрузке через ImageField, вам понадобится создать функцию, которая будет вызываться в момент сохранения модели. В этой функции вы можете изменить имя файла, используя метод os.path
, и затем сохранить его в поле ImageField
.
Вот пример подробного объяснения, как это сделать.
1. Создайте функцию, которая будет вызываться в момент сохранения модели. Вы можете использовать метод @receiver
декоратора pre_save
, который будет автоматически вызывать вашу функцию перед сохранением модели.
from django.db.models.signals import pre_save from django.dispatch import receiver from django.core.files.storage import default_storage from django.core.files.base import ContentFile import os @receiver(pre_save, sender=YourModelName) def change_image_filename(sender, instance, **kwargs): # Проверяем, загружено ли изображение if instance.image: # Получаем имя файла filename = os.path.basename(instance.image.name) # Генерируем новое имя файла (делаем изменения, которые вам нужны) new_filename = 'new_image_name' + os.path.splitext(filename)[1] # Проверяем, существует ли файл с новым именем, если да, добавляем случайный хэш для уникальности while default_storage.exists(new_filename): new_filename = 'new_image_name' + '_' + get_random_hash() + os.path.splitext(filename)[1] # Открываем файл и сохраняем его с новым именем with default_storage.open(instance.image.name, 'rb') as old_file: new_file = ContentFile(old_file.read()) instance.image.save(new_filename, new_file, save=False)
2. Важно обратить внимание, что мы используем instance.image.name
для получения имени загруженного файла из поля ImageField
. Затем мы используем модуль os.path
для получения имени файла и его расширения.
3. Мы генерируем новое имя файла, добавляя к исходному имени какие-либо изменения, которые вам нужны. В данном примере мы добавляем "new_image_name" перед расширением файла.
4. Затем мы проверяем, существует ли уже файл с таким именем. Если да, мы добавляем случайный хэш, чтобы обеспечить уникальность.
5. Наконец, мы открываем исходный файл, читаем его содержимое и сохраняем его с новым именем с использованием instance.image.save
.
Это исходный пример функции, которая будет вызываться при сохранении модели для изменения имени файла, но вы можете изменить этот код и добавить любые другие изменения, которые вам нужны.