Загружаемый файл DOCX при нажатии кнопки - PullRequest
0 голосов
/ 15 января 2020

У меня есть файлы (файл docx), которые нужно разрешить пользователям загружать, нажимая на кнопку. Эти файлы были загружены в FileField модели. Это мой views.py

def files_view(request):
    files = FileModel.objects.filter(user=request.user)
    return render(request, template_name='folder/files_list.html')

и это мой шаблон. html

{% for serving_files in user.files.all %}
<a href="{{ serving_files.url }}"><button>Download</button></a>

Я делаю это, но файлы не могут загрузить. Какие изменения мне нужно сделать?

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Я настроил код от @ ans2human, и это сработало для меня в firefox и chrome:

def download_viewing_agreement_view(request):
    file_path = pathlib.Path(settings.MEDIA_ROOT, 'filename.docx')
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
            filename = 'filename.docx'
            file_expr = "filename*=utf-8''{}".format(quote(filename))   # Handle a non-ASCII filename
            response['Content-Disposition'] = 'attachment; {}'.format(file_expr)
            return response
0 голосов
/ 15 января 2020

Итак, при нажатии кнопки вызывайте эту функцию, код не тестируется, но с небольшими изменениями это должно работать.

import os
from django.conf import settings
from django.http import HttpResponse, Http404

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/vnd.openxmlformats-officedocument.wordprocessingml.document')
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response
    raise Http404
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...