Проблема Django с загрузкой файла с моего компьютера

Я новичок в Django и мне нужна помощь. Я хочу скачать файл, путь к которому находится в plik.localisation (он был взят из цикла). Проблема заключается в пути. Может ли кто-нибудь помочь мне, что я делаю не так? Мой view.py выглядит так:

def download(request, path):
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="application/pdf")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response
    raise Http404

Урлы

    path('download/(?P<path>)$', serve,{'document root': path}, name="download"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Html

            <div class="com">
               {{plik.localisation}} <a href="{% url download/path %}" class="button">downloadz</a>
            </div>

Я пытался изменить этот путь, но все еще испытываю проблемы с ним.

В вашем urlpatterns отсутствует path() с name 'download/path', поэтому при нажатии на этот тег анкора вы получите 404 статус ответа HTTP.

Что вы хотите:

<div class="com">
    <a href="{% url 'download' plik.localisation %}" class="button">download</a>
</div>

Айд:

Хотите ли вы показать файл как часть веб-страницы (учитывая, что вы используете заголовок Content-Disposition: inline)? Если да, то зачем давать тегу якоря текст, который говорит "download"? Если файл будет загружаться клиентом, то вот как должен выглядеть код сервера:

#•••Rest of code•••
if os.path.exists(file_path):
    return FileResponse(open(file_path, 'rb'), as_attachment=True, filename=os.path.basename(file_path)) #[1]

Если файл предназначен для показа в качестве части веб-страницы, то текст тега якоря не должен быть "download". Это вводит в заблуждение. Скорее всего, это должно быть "view", "open" или любой другой вариант того же сообщения, поскольку оно не будет загружено. Тогда ваш код будет выглядеть так:

#•••Rest of code•••
if os.path.exists(file_path):
    return FileResponse(open(file_path, 'rb'), filename=os.path.basename(file_path))[2]

[1] The Content-Type header is automatically set when it can be guessed from the filename, or the name of open_file so no need for "application/pdf".

[2] as_attachment is False by default. Content-Disposition: inline will now be the header set.

Этот код работает def download(request, path): with open(path, 'rb') as fh: if os.path.exists(path): return FileResponse(open(path, 'rb'), as_attachment=True, filename=os.path.basename(path)) raise Http404

Вернуться на верх