2017-02-15 2 views
2

Если вы загрузили файл image.png из веб-браузера, в каталоге загрузки на сервере появится новый файл с именем image.png.Как Django переименовывает загруженные файлы?

Если я загружаю еще один файл с именем 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}) 
+0

Проверьте параметр upload_to в определении модели. –

+0

@BipulJain Аргумент upload_to указывает, куда помещать загруженный файл. Он ничего не говорит о схеме переименования. Может, я что-то упустил? – Flux

+0

Вы можете указать способ там. Который должен был переименовать логику. –

ответ

3

Джанго по умолчанию методы класса хранения называется 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. 

Джанго по умолчанию сохраняет объект по его имени, но если объект с таким именем уже существует складывает подчеркивание и 7 случайных символов как указаны в коде комментарии

также как дополнение к этому методу класса Django класса get_valid_name анализирует имя файла до и заменяет все пробелы символами подчеркивания и удаляет все символы, которые не являются юникодами, альфа, тире, подчеркиванием или точкой

re.sub(r'(?u)[^-\w.]', '', s)