Как создать ссылку для скачивания файла? - PullRequest
1 голос
/ 26 апреля 2019

Я создал модель без использования FileField () и сохранил URL в поле пути.Теперь при отображении я вижу атрибуты, но не могу загрузить файл.href обрабатывает его как страницу, и я получаю сообщение об ошибке, в котором говорится, что запрос GET не выполнен.

Мне нужно сделать то же самое для статических файлов.

models.py выглядит так:

*В шаблоне 1006 *

есть такой код:

    <a href = '{{ MEDIA_URL }}{{ value.thesis.relative_path }}'> Thesis </a>

    *static files*
   <a href='/uploads/report.pdf'> Front Page</a>

Я попытался использовать свойство и указать путь самостоятельно.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Чтобы разрешить загрузку файлов, вам нужно создать отдельное представление с FileResponse в качестве ответа.Это представление будет принимать какой-то уникальный аргумент (я предполагаю, что это будет относительный путь к файлу) с URL-адресом, предоставленным в HTML-шаблоне.В этом представлении FileResponse откроет ваш файл по указанному пути, а затем вернет ответ с вашим файлом.Я думаю, вы должны сделать это так:

Views.py:

def download_file(request, relative_path): # this is a view with file response
    media_root = settings.MEDIA_ROOT
    return FileResponse(open(f"{media_root}\{relative_path}", "rb"), as_attachment=True, filename="some_name.smth")

шаблон:

    <a href = '{% url "download" relative_path=value.thesis.relative_path %}'> Thesis </a>

    *static files*
   <a href='/uploads/report.pdf'> Front Page</a>

urls.py:

urlpatterns = [
    path("download-file/<slug:relative_path>/", views.download_file, name="download")]

Вам нужно будет объединиться с PATH, чтобы заставить его работать.

0 голосов
/ 26 апреля 2019

urls.py (project / urls.py)

from django.conf.urls.static import static

urlpatterns = [
    ...
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py

...

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...