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
Вернуться на верх