Установка поля FileFIeld на существующий файл в медиа - ошибка пути
У меня есть форма, в которой пользователь загружает файл, который я сохраняю непосредственно в MEDIA_ROOT
и делаю некоторые преобразования. После этого я хочу сохранить его в FileField
в модели. Вот функция, которая обрабатывает файл. (она вызывается из представления, содержащего форму process(request.FILES['track'])
)
from .models import Track
from django.conf import settings
import os
def process(f):
fname = str(uuid.uuid4())+ '.' + str(f).rsplit('.', 1)[1]
fullPath = os.path.join(settings.MEDIA_ROOT, 'tracks', fname)
with open(fullPath, 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
#PROCESS THE FILE (abridged)
instance = Track(
title = str(f),
)
instance.file.name = f"/tracks/{fname.rsplit('.', 1)[0]}.mp3"
instance.save()
print("******************")
print(instance.file)
print(instance.file.url)
print(instance.file.storage.location)
print(instance.file.path)
#print(instance.file.storage.location)
return (True, {"trackId" : instance.id})
Я следую этому ответу для установки свойства name
в FileField
(которое называется file
), так как у меня уже есть готовое, я не очень хочу читать/сохранять его снова, как советует django docs.
Теперь я могу в основном использовать FileField
, но когда я пытаюсь получить абсолютный путь, он выдает ошибку (вот вывод операторов печати)
******************
/tracks/7d90c385-8f74-4b44-a376-5335069372d3.mp3
/media/tracks/7d90c385-8f74-4b44-a376-5335069372d3.mp3
D:\prog\proj\music_web\media
The joined path (D:\tracks\7d90c385-8f74-4b44-a376-5335069372d3.mp3) is located outside of the base path component (D:\prog\proj\music_web\media)
Я проверил, как путь должен быть создан в django.core.files.storage
и это просто return safe_join(self.location, name)
, поэтому я не могу понять, что происходит не так, когда у меня есть правильный location
при печати сам по себе, но когда дело доходит до вычисления пути, он просто использует диск вместо правильного полного пути к носителю. Может ли кто-нибудь помочь мне с этим?