Upload_to и хранилище не работают в Django 4.1
Я только что обновил свой Django с 2.x до 4.x. У меня есть функция, которая не работает правильно. Я перепробовал много всего, но так и не смог разобраться. Так что мне нужна помощь
file = models.FileField(
upload_to=get_file_path,
storage=AbsolutePathStorage(),
max_length=500,
)
from django.core.files.storage import FileSystemStorage
class AbsolutePathStorage(FileSystemStorage):
"""Storage that allows storing files given absolute paths."""
def path(self, name: str) -> str:
"""Override path validation to allow absolute paths."""
# Return name if it's a absolute path.
if name.startswith("/"):
return name
# Return regular joined path if this is a relative path.
return super().path(name)
Перед обновлением Django, файл загружается в папку upload_to (вне MEDIA_ROOT). Все работает нормально. Но после того, как я обновил Django до 4.1. Он больше не работает и жалуется на:
The joined path (upload_to) is located outside of the base path component (MEDIA_ROOT ).
Есть идея?
Спасибо.
Вы вызываете super().path()
в своей функции, где и возникает эта ошибка.
class AbsolutePathStorage(FileSystemStorage):
...
class FileSystemStorage:
def path(self, name):
return safe_join(self.location, name) # safe_join raises the error
Если ваша функция upload_to
возвращает абсолютный путь, то похоже, что вы можете просто использовать имя как есть и никакой логики в функции name()
не требуется. Здесь assert
просто проверка на вменяемость.
class AbsolutePathStorage(FileSystemStorage):
def path(self, name: str) -> str:
assert name.startswith("/"), f"Path was not absolute: {name}"
return name