Неправильный путь для ImageField в Django - PullRequest
0 голосов
/ 12 июня 2018

У меня есть модель с ImageField и функцией для изменения пути загрузки

class Images(models.Model):
    def upload_path(self, filename):
        return os.path.join(settings.TOOLS_IMAGE_UPLOADS, self.get_artworkID(),
                            filename)

    image = models.ImageField(upload_to=upload_path)
    artworkID = models.IntegerField(null=True, blank=True)

    def __str__(self):
        if self.title == "" or not self.title:
            return str(self.image)
        return self.title

    def get_artworkID(self):
        if self.artworkID:
            return str(self.artworkID)
        return 'temp'

Значение TOOLS_IMAGE_UPLOADS равно

PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(PROJECT_DIR)
MEDIA_NAME_FOLDER = 'media'
MEDIA_ROOT = os.path.join(BASE_DIR, MEDIA_NAME_FOLDER)
TOOLS_IMAGE_UPLOADS = os.path.join(MEDIA_ROOT, 'uploads', 'images')

Проблема в том, что возвращенный URL-адреспри визуализации объекта Image через администратор Django или остальные API неверны

Возвращенный путь: http://localhost:8000/media/webapp/artrights/media/uploads/images/temp/file.png

Реальный путь к файлу: http://localhost:8000/media/uploads/images/temp/file.png

Я делаючто-то не так или мне просто нужно сделать собственную функцию для возврата правильного пути?

1 Ответ

0 голосов
/ 12 июня 2018

Вызываемый upload_to должен возвращать путь относительно MEDIA_ROOT, поскольку он будет добавлен к нему.

Проблема, которую я считаю, состоит в том, что TOOLS_IMAGE_UPLOADS уже включает MEDIA_ROOT.

Так что в действительности функция должна возвращать часть пути после MEDIA_ROOT:

def upload_path(self, filename):
    return os.path.join('uploads', 'images', self.get_artworkID(), filename)
...