2016-11-10 2 views
0

ich an einem Projekt, dass der Benutzer (Kunde) arbeiten anmelden und Informationen über seine Rechnungen einsehen können, laden Sie sie (im PDF-Format) usw.Wie dynamischen Pfad zu einer Datei in django setzen

Wenn Benutzer setted Im Adminbereich werden seine PDF-Dateien hochgeladen (Benutzer kann viele PDF-Dateien haben)

Wenn Pdfs hochgeladen wird, erstellen eine Funktion Ordner basierend auf seiner ID, und legen Sie sie in, also muss ich eine Dynamicaly-Funktion erstellen, die heruntergeladen wird die richtige PDF-Datei, wenn der Benutzer darauf klickt.

Dies ist eine in HTML, die alle „Gebühren“ zu Benutzer druckt:

{% for printforme in print_user_charges %} 
     <tr> 
      <td>{{ printforme.invoice_number }}</td> 
      <td>{{ printforme.price }} €</td> 
      <td>{{ printforme.reason }}</td> 
      <td>{{ printforme.customer }} {{ printforme.customer.surname }}</td> 
      <td>{{ printforme.charge_date }}</td> 
      <td> <a href="{% url 'download_pdf' printforme.id %}"> Download </a></td> 

{% endif %} 

Auch ich versuche, eine Funktion zu erstellen, die den Pfad dynamicaly setzt und es in einen String django Umwandlung sagt mir, dass ein erwartet String und keine Funktion.

def DownloadPdf(request, charge_id):                                

with open(os.path.join(settings.MEDIA_ROOT,models.Charge.upload_pdf.url, 'rb') as fh:  
    response = HttpResponse(fh.read(), content_type="application/pdf") 
    response['Content-Disposition'] = 'filename=invoice.pdf'    
    return response              

Ich möchte die URL der ausgewählten PDF-Basis in die ID einfügen. Aber ich weiß nicht, wie man die URL herauszieht und sie mit dem anderen Medienpfad verbindet und korrekt die ID verwendet.

bearbeiten

wenn ich das ändern:

url(r'^download/(?P<charge_id>\d+)/$', views.DownloadPdf, name='download_pdf'), 

und diese:

with open(os.path.join(settings.MEDIA_ROOT, charge_id), 'rb') 

es gibt mir diesen Fehler:

Reverse for 'download_pdf' with arguments '('/media/user_4/invoice-alex-1.pdf',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['download/(?P\d+)/$']

Antwort

0

Schließlich finde ich eine funktionierende Lösung

Mein Hauptproblem war es, dass ich versuche, war eine Instanz zu bekommen, und ich es nicht in jede Variable übergeben, bevor ich versuche, die Datei zu laden. Ich ändere die offene Methode zu, ich fand die letzte klarer.

def DownloadPdf(request, charges_id): 

try: 
    invoice = Charge.objects.get(pk=charges_id) 
except Charge.DoesNotExist: 
    raise Http404 

response = HttpResponse(File(invoice.upload_pdf), content_type="application/pdf") 
response['Content-Disposition'] = 'attachment; filename="mypdf.pdf"' 
return response 
0

Sie kein schreiben müssen Ansicht, um das Downlo zu behandeln Teil anzeigen. Browser sind heute intelligent genug, um den Download-Teil zu handhaben. Führen Sie in Ihrer Vorlage einfach Folgendes aus (vorausgesetzt, dass Sie auf Vorlagenebene wissen, wer ein Benutzer ist und welche Art von Datei für ihn heruntergeladen werden soll. Übergeben Sie diese Informationen im Kontext der Ansicht, in der der Benutzer die Berechtigung hat um Zeug herunterzuladen.):

<a href="{{MEDIA_URL}}<your_file_with_id.pdf>">Download File</a> 

Und das ist es. Der Browser lädt die Datei automatisch herunter. Sie müssen nichts anderes tun.