Django скачать файл

Я новичок в использовании Django, и я пытаюсь создать веб-сайт, на котором пользователь может загружать несколько файлов excel, эти файлы затем сохраняются в папке с медиафайлом Webproject/project/media.

def upload(request):
    if request.POST:
        form = FileForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return render_to_response('project/upload_successful.html')
    else:
        form = FileForm()
    args = {}
    args.update(csrf(request))
    args['form'] = form

    return render_to_response('project/create.html', args)

Затем документ отображается в списке вместе с любым другим загруженным им документом, на который вы можете щелкнуть, и отобразит основную информацию о них и имя загруженного excelfile. Отсюда я хочу снова загрузить один и тот же файл excel, используя ссылку:

 <a  href="/project/download"> Download Document </a>

Мои URL-адреса

 urlpatterns = [

              url(r'^$', ListView.as_view(queryset=Post.objects.all().order_by("-date")[:25],
                                          template_name="project/project.html")),
              url(r'^(?P<pk>\d+)$', DetailView.as_view(model=Post, template_name="project/post.html")),
              url(r'^upload/$', upload),
              url(r'^download/(?P<path>.*)$', serve, {'document root': settings.MEDIA_ROOT}),

          ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

но я получаю ошибку, serve() получил неожиданный аргумент ключевого слова 'document root'. может кто-нибудь объяснить, как это исправить?

ИЛИ

Объясните, как я могу загрузить загруженные файлы и их использовать с помощью

def download(request):
    file_name = #get the filename of desired excel file
    path_to_file = #get the path of desired excel file
    response = HttpResponse(mimetype='application/force-download')
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)
    response['X-Sendfile'] = smart_str(path_to_file)
    return response

Ответ 1

Вы пропустили подчеркивание в корне документа аргумента _. Но это плохая идея использовать serve в производстве. вместо этого используйте что-то вроде этого:

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.ms-excel")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response
    raise Http404

Ответ 2

Я обнаружил, что Django FileField действительно помогает пользователям загружать и скачивать файлы. В документации Django есть раздел, посвященный управлению файлами. Вы можете хранить некоторую информацию о файле в таблице вместе с FileField, который указывает на сам файл. Затем вы можете перечислить доступные файлы, выполнив поиск по таблице.

Ответ 3

Вы можете добавить атрибут "download" внутри тега для загрузки файлов.

<a  href="/project/download" download> Download Document </a>

https://www.w3schools.com/tags/att_a_download.asp