Как Django переименовывает загруженные файлы?
Если загрузить файл image.png
из веб-браузера новый файл с именем image.png
появится в каталоге загрузки на сервере.
Если я тогда загрузить другой файл с именем image.png
(то же имя), новый файл с именем image_aj642zm.png
появится в каталоге загрузки на сервере.
Затем, если я загружу другой файл с именем image.png
(опять то же имя), новый файл с именем image_z6z2BaQ.png
появится в каталоге загрузки на сервере.
Какой метод использует Django для переименования загруженного файла, если файл с таким именем уже существует в каталоге загрузки?
(то есть, где _aj642zm
а также _z6z2BaQ
родом из?)
Обычная настройка:
В models.py:
from django.db import models
class Image(models.Model):
image = models.ImageField(upload_to='uploads/')
В Forms.py:
from django import forms
from .models import Image
class ImageForm(forms.ModelForm):
class Meta:
model = Image
fields = ['image']
В views.py:
from django.shortcuts import render, redirect
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('index')
else:
form = ImageForm()
return render(request, 'upload_file.html', {'form': form})
1 ответ
Метод класса хранения Django по умолчанию называется get_available_name
# If the filename already exists, add an underscore and a random 7
# character alphanumeric string (before the file extension, if one
# exists) to the filename until the generated filename doesn't exist.
# Truncate original name if required, so the new filename does not
# exceed the max_length.
Django по умолчанию сохраняет объект по имени, но если объект с таким именем уже существует, он добавляет подчеркивание и 7 случайных символов, как указано в комментарии к коду.
Кроме того, в дополнение к этому методу класса Django Storage, get_valid_name анализирует имя файла и заменяет все пробелы символами подчеркивания и удаляет все символы, которые не являются юникодом, альфа, дефисом, подчеркиванием или точкой
re.sub(r'(?u)[^-\w.]', '', s)