2016-04-03 17 views
7

Ich bin ziemlich neu in der Verwendung von Django und ich versuche, eine Website zu entwickeln, wo der Benutzer eine Reihe von Excel-Dateien hochladen kann, diese Dateien werden dann in einem Medienordner gespeichert Webprojekt/Projekt/Medien.Django eine Datei herunterladen

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) 

Das Dokument wird dann in einer Liste angezeigt zusammen mit einem anderen Dokument sie hochgeladen haben, die Sie in und es wird angezeigt grundlegende Informationen über sie und den Namen des Excelfile klicken können sie hochgeladen haben. Von hier aus möchte ich Excel die gleiche herunterladen können Datei erneut über den Link:

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

Meine Urls sind

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) 

aber ich habe den Fehler, dienen() bekam ein unerwartetes Schlüsselwort-Argument ' Dokument Root'. kann jemand erklären, wie man das repariert?

ODER

erklären, wie ich die hochgeladenen Dateien erhalten kann ausgewählt werden und serviert mit

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

können Sie den Code aus der 'serve' Ansicht einschließen? – xthestreams

Antwort

21

Sie verfehlten Strich in Argumente Dokument _ Wurzel. Aber es ist eine schlechte Idee, serve in der Produktion zu verwenden. Verwenden Sie stattdessen Folgendes:

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

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 
+0

hat super funktioniert. Danke – jsm1th

+0

Es funktioniert reibungslos für mich. thx @ Sergey Gornostajew – gustav