2016-11-10 85 views
0

我上一個項目,用戶(客戶)的工作可以登錄並可以查看自己的發票信息,將它們下載(PDF格式)等如何在Django動態路徑設置爲一個文件

當用戶設置好的了在管理面板上,他的pdf文件被上傳(用戶可以有很多Pdf文件)

當Pdfs上傳時,一個函數根據他的id創建文件夾,並將它們放入,所以我必須創建一個動態函數,下載正確的PDF文件,當用戶點擊它。

這是一個用於在HTML中,打印所有「罪名」用戶:

{% 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 %} 

即使我嘗試創建dynamicaly設置路徑的功能,並將其轉換爲字符串的Django告訴我,需要一個字符串,而不是一個函數。

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              

我想插入選定的pdf基地址到id。但我不知道如何提取網址並將其與其他媒體路徑鏈接並正確使用該ID。

編輯

如果我改成這樣:

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

這:

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

它給我的錯誤:

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+)/$']

回答

0

畢竟我找到一個可行的解決方案

我的主要問題是,我是試圖讓一個實例,我不把它傳遞到任何變量之前,我嘗試加載該文件。 我改變了開放的方法,我發現最後一個更清楚。

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

你不需要寫查看處理下載廣告部分。今天的瀏覽器足夠聰明,可以處理下載部分。在您的模板中,只需執行以下操作(假設在模板級別,您知道誰是用戶,以及要爲他下載什麼類型的文件。只需在用戶將擁有權限的視圖的上下文中傳遞所有這些信息下載東西。):

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

就是這樣。瀏覽器將自動下載該文件。你不需要做其他事情。