Невозможно открыть ссылку, содержащую специальные символы

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

<p class="article-content mt-2 mb-1"><strong>Attachment: </strong><a href="{{post.file_close.url}}">{{post.file_close.name}}</a></p>

Если я загружаю файл cars.png, все работает нормально в обеих версиях. Это работает независимо от расширения, pdf, excel, изображение и т.д. Проблема в том, что если я загружаю файл carsčč.png, то сбой происходит только на стороне сервера, на моем ПК все работает отлично. Я получаю следующую ошибку на моем Django/debugg:

Page not found (404)
“C:\inetpub\files\PyWeb\media\PN_files\2022\03\06\cars” does not exist

Как будто ссылка не завершена, она остановилась, как только наткнулась на специальный символ. Но показанная ссылка все еще содержит все буквы, это PN_files/2022/03/06/carsčč.png. Пробовал: Я посмотрел региональные настройки, они одинаковы на обоих ПК. Есть ли что-то еще, что я могу проверить или изменить? Может быть, включить что-то в ссылку? Также, когда я вручную ищу файл, имя не искажается, оно сохраняется локально как carsčč.png. Так что я думаю, что дело только в ссылке, которая пытается получить файл. Я понял, что это из-за диакритических букв. В моем 'base.html' у меня meta charset="utf-8". Django устанавливает LANGUAGE_CODE = 'hr-BA'.

Я использую Bootstrap 4.0 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">

В строке <a href="{{post.file_close.url}}"> вы внутренне вызываете метод url() базового класса Storage, который возвращает неверный url “C:\inetpub\files\PyWeb\media\PN_files\2022\03\06\cars”.

Основная проблема находится внутри вашего класса хранилища. Вероятно, вы используете FileSystemStorage из django. Всякий раз, когда вы сохраняете файл, класс хранилища вызывает storage.get_valid_name, который возвращает имя, подходящее для использования в целевой системе (ref). На этом этапе происходит замена специальных символов. Код, предоставленный на Storage, сохраняет только буквенно-цифровые символы, точки и подчеркивания из исходного имени файла, удаляя все остальное (ref)Код, предоставленный на Storage, сохраняет только буквенно-цифровые символы, точки и подчеркивания из исходного имени файла, удаляя все остальное).

Если вы хотите изменить это поведение, вы можете написать свой собственный класс пользовательского хранилища и переписать метод get_valid_name (ref).

Вернуться на верх