Django текущая ссылка модели не указывает на файл в MEDIA_ROOT - PullRequest
0 голосов
/ 03 февраля 2020

Мой код генерирует Pandas фреймов данных. Они большие. Я сохраняю их как файлы. Для этого я создал Model:

models.py:

class TargetFiles(models.Model):
    owner = models.CharField(max_length=25)
    csv_file = models.FileField(blank=True, upload_to='target')
    file_name = models.CharField(max_length=255)

settings.py:

...
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_URL = '/media/'
MEDIA_ROOT =  os.path.join(BASE_DIR, 'media')

mycode.py:

file_content = df.to_csv(index=False, encoding='utf-8')
csvname = 'target1.csv'
csf = ContentFile(file_content, csvname)
TargetFiles.objects.create(owner=self.user, csv_file=csf, file_name=csvname)

urls.py (проект):

from django.urls import include, path
from django.contrib import admin

urlpatterns = [
    path('dataapp/', include('dataapp.urls')),
]

urls .py (dataapp):

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='dataapp'),
    path('welcome/', views.welcome_dataapp, name='welcome_dataapp'),
    path('download/<str:file_name>', views.download, name='download'),
]

Я не знаю, является ли это лучшим подходом к решению проблемы. Эта документация сделала меня скептиком. Дело в том, что мой код правильно генерирует файл и сохраняет его в каталоге MEDIA_ROOT. Но когда я go для просмотра администратором и щелкаю на объекте TargetFiles, ссылка на файл возвращает эту ошибку:

Текущий путь media/target/target1.csv не соответствует ни одному из них.

Так как я не эксперт по Django, я думаю, что что-то не так. Может быть, в settings.py или в urls.py (в этом файле я не писал никаких ссылок на носители, возможно, именно в этом и заключается ошибка).

Я уже прочитал эти сообщения: Django - как создать файл и сохранить его в FileField модели? , Django: сгенерировать CSV-файл и сохранить его в FileField , а назначить полученный CSV-файл django модель . Но я не смог сделать ссылку администратора на файл MEDIA_ROOT.

У кого-нибудь есть идеи?

Заранее спасибо.

1 Ответ

0 голосов
/ 03 февраля 2020

Django не обслуживает файлы, хранящиеся в MEDIA_ROOT. Вы можете включить эту во время разработки , добавив в конфигурацию root url следующее:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

https://docs.djangoproject.com/en/3.0/howto/static-files/#serving -files-up-by-a-user- в процессе разработки

Рекомендуется разрешить обработку файлов другим сервером (apache или nginx) для развертывания на рабочем сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...