2016-11-14 264 views
0

如何設置一個動態的下載路徑通過改變這部分的Django:設置動態下載路徑的Django

(settings.MEDIA_ROOT, 'folder/path/file.pdf')

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

到這樣的事情:

(settings.MEDIA_ROOT, FUNCTION_RETURN_THE_PATH)

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

如果一個使用函數我得到很多錯誤,因爲它期望在這個地方的字符串變量,而不是一個函數。

在我的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.upload_pdf.id %}"> Download </a></td> 

的下載鏈接駛入一個觀點:

def DownloadPdf(request, charge_id): 

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

我保存的PDF,基地給用戶ID喜歡這樣的:

def invoice_path_base_to_usersid(instance, filename): 
return 'user_{0}/{1}'.format(instance.customer.id, filename) 

所以我保存的PDF媒體/用戶_ {ID} /filename.pdf

我希望用戶下載特定的pdf文件時,他點擊了正確的項目。 但我不知道如何使用用戶ID,並把它放在打開的下載用戶想要的一個PDF格式的正確。

+0

這是非常不清楚使用它。你的功能是做什麼的?它返回一個字符串嗎?你真的在任何地方打電話嗎? –

+0

我並沒有要求整個項目的解決方案。我只是想知道是否有任何方法可以通過open(...)函數中的直接字符串路徑來傳遞其他內容。 –

+0

當然可以。如果你有一個函數返回一個字符串,並且你在那裏調用它,Python不會知道它的區別。你顯然不在那裏做那些事情,但是沒有看到真正的代碼,我們不知道是什麼。 –

回答

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 

因此,答案是,如果你想在Django你要查詢你的模型,並把輸出變量的dynamicaly下載路徑。

之後,通過調用這個變量,以這種方式:

variable.field_of_model

您可以參考該記錄的任何領域,只要你想

0

您還沒有調用該函數。

with open(os.path.join(settings.MEDIA_ROOT, get_file_path()), 'rb') as fh: 
+0

我這樣做,它給了我錯誤: FileDescriptor的對象不可調用 –