FileField: как использовать upload_to с пробелами в имени и пути - PullRequest
0 голосов
/ 06 июня 2019

У меня есть модель, которая позволяет загружать файл, но по какой-то причине пробел, определенный в пользовательской функции upload_to, заменяется подчеркиванием в файловой системе (или в s3) для имени файла и пути к папке .

Есть ли способ обеспечить использование пробелов?

например: Файл "hello world.png" становится "hello_world.png"

ps: я знаю, что использовать пробелы - плохая практика, но это не мой выбор.

Вот код:

models.py

one_file = models.FileField(
    _('My label'),
    null=True,
    blank=True,
    upload_to=one_file_name,
    max_length=500,
    #part for s3, using the local media doens't change anything
    storage=PrivateMediaStorage(),
)

моя функция upload_to

def one_file_name(instance, filename):
    extension = filename.split(".")[-1]
    return f'folder name/subfolder name/{filename}.{extension}'

1 Ответ

1 голос
/ 06 июня 2019

пробел в имени файла, потому что в любом случае это ошибка в URL. Я думаю, что это может помочь вам, Django вызывает get_valid_filename (), чтобы внести некоторые изменения в имена файлов при сохранении - в зависимости от вашего случая, пробелы заменяются подчеркиваниями или чем угодно. Вы можете найти полные документы здесь.Вот сама функция:

@keep_lazy_text
def get_valid_filename(s):
    """
    Returns the given string converted to a string that can be used for a clean
    filename. Specifically, leading and trailing spaces are removed; other
    spaces are converted to underscores; and anything that is not a unicode
    alphanumeric, dash, underscore, or dot, is removed.
    >>> get_valid_filename("john's portrait in 2004.jpg")
    'johns_portrait_in_2004.jpg'
    """
    s = force_text(s).strip().replace(' ', '_')
    return re.sub(r'(?u)[^-\w.]', '', s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...