簡體   English   中英

如何在Django中設置文件的動態路徑

[英]How to set dynamic path to a file in django

我正在研究一個項目,用戶(客戶)可以登錄並可以查看有關其發票的信息,也可以下載(以Pdf格式)等。

當用戶在管理面板中設置后,他的pdf文件就會上傳(用戶可以有很多Pdf文件)

當Pdfs上傳時,一個函數會基於他的id創建文件夾,並將其放入,因此我必須創建一個dynamicaly函數,當用戶單擊它時,它將下載正確的pdf文件。

這是html中的for,它向用戶顯示所有“費用”:

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

甚至我嘗試創建一個可以動態設置路徑並將其轉換為字符串的函數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。 但是我不知道如何拉出URL並將其與其他媒體路徑鏈接並正確使用ID。

編輯

如果我更改為:

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

和這個:

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

它給我那個錯誤:

反向使用參數'('/media/user_4/invoice-alex-1.pdf')和參數'{}'的'download_pdf'。 嘗試了1種模式:['download /(?P \\ d +)/ $']

您無需編寫視圖即可處理下載部分。 當今的瀏覽器足夠聰明,可以處理下載部分。 在您的模板中,只需執行以下操作(假設在模板級別上您知道誰是用戶,以及將為他下載哪種文件。只需在用戶將擁有權限的視圖上下文中傳遞所有這些信息下載內容。):

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

就是這樣。 瀏覽器將自動下載文件。 您無需執行其他任何操作。

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

我的主要問題是我嘗試獲取實例,並且在嘗試加載文件之前沒有將其傳遞給任何變量。 我將打開方法更改為,我發現最后一個更清晰了。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM