【问题标题】:How to set dynamic path to a file in django如何在 django 中设置文件的动态路径
【发布时间】:2017-03-24 16:46:22
【问题描述】:

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

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

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

这是一个 for in 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 %}

即使我尝试创建一个动态设置路径并将其转换为字符串的函数,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 库的 url 插入到 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+)/$']

【问题讨论】:

    标签: python django function dynamic download


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      毕竟我找到了一个可行的解决方案

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        相关资源
        最近更新 更多