如何在django中设置文件的动态路径

时间:2016-11-10 15:31:37

标签: python django function dynamic download

我正在开发一个用户(客户)可以登录的项目,可以查看有关他的发票的信息,下载它们(以Pdf格式)等。

当用户在管理面板中设置时,他的pdf文件被上传(用户可以有多个Pdf文件)

当上传Pdfs时,一个函数根据他的id创建文件夹,并将它们放入,所以我必须创建一个dynamicaly函数,当用户点击它时下载正确的pdf文件。

这是一个用于打印所有"费用"对用户:

{% 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中。但我不知道如何拔出网址并将其与其他媒体路径链接并正确使用ID。

修改

如果我改为:

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

和此:

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

它给了我这个错误:

  

反向&#39; download_pdf&#39;参数&#39;(&#39; /media/user_4/invoice-alex-1.pdf' ;,)&#39;和关键字参数&#39; {}&#39;未找到。尝试了1种模式:[&#39;下载/(?P \ d +)/ $&#39;]

2 个答案:

答案 0 :(得分:0)

您无需编写视图来处理下载部分。今天的浏览器足够聪明,可以处理下载部分。在您的模板中,只需执行以下操作(假设您在模板级别知道谁是用户以及要为他下载哪种文件。只需在用户拥有权限的视图上下文中传递所有这些信息。下载东西。):

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

就是这样。浏览器将自动下载该文件。你不需要做任何其他事情。

答案 1 :(得分:0)

毕竟我找到了一个有效的解决方案

我的主要问题是我尝试获取一个实例,并且在尝试加载文件之前我没有将其传递给任何变量。 我将open方法改为,我发现最后一个方法更清楚了。

<a href=url to your picture target="_blank">Image in new window</a>