2016-11-10 81 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> 

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