Получение истинного url файла после загрузки пользователем в django
вот проблема. в моем проекте пользователь собирается загрузить файл excel и сразу после этого приложение должно взять его и прочитать, используя pandas
. файл загружен в media/projects/%Y/%m/%d/
:
views.py
:
if request.method == 'POST' and request.FILES['createdatabase']:
user = request.user
data = request.FILES['createdatabase']
new = NewProject(
user=user,
data=data,
)
new.save()
models.py
:
from django.db import models
from django.contrib.auth.models import User
class NewProject(models.Model):
user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
data = models.FileField(blank=True, upload_to='projects/%Y/%m/%d/')
u = models.TextField(blank=True)
v = models.TextField(blank=True)
w = models.TextField(blank=True)
u
, v
и w
находятся в файле данных, который загружает пользователь, и приложение должно прочитать его. когда я хочу прочитать файл в pandas
, используя метод read_excel()
, ему нужен URL файла. использование data.url
или data.path
не работает, кажется, что он просто говорит имя файла или неправильный путь media/datafilename.xlsx
. Истинный URL файла должен быть чем-то вроде media/2022/07/01/datafilename.xlsx
. Кроме того, некоторые файлы могут иметь одинаковые имена, загруженные пользователями. поэтому Django просто добавляет к ним случайную строку. но data.url
и data.path
выводят основное имя файла, а не измененное.
Любая помощь будет оценена по достоинству.
Попробуйте вот это. https://docs.djangoproject.com/en/4.0/ref/models/fields/#django.db.models.FileField.upload_to
from datetime import datetime
from uuid import uuid4
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/projects/<year>/<month>/<day>/<filename>
ext = filename.split(".")[-1]
filename = "%s.%s" % (uuid4(), ext)
today = datetime.now()
today_path = today.strftime("%Y/%m/%d")
return 'projects/{0}/{1}'.format(today_path, filename)
class NewProject(models.Model):
data = models.FileField(upload_to=user_directory_path)
Для доступа к загруженному файлу,
project.data.path # etc: '/media/projects/2022/07/02/4cc38320-556c-490a-90d5-f8834bf75275.xlsx'
Обратитесь https://docs.djangoproject.com/en/4.0/topics/files/#using-files-in-models