设置django的动态下载路径

时间:2016-11-14 10:01:02

标签: python django dynamic download

如何通过更改此部分来设置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存储到media / user_ {id} /filename.pdf

我希望用户在点击当前项目时下载特定的pdf文件。 但我不知道如何使用用户ID并将其置于开放状态下载当前用户想要的pdf。

2 个答案:

答案 0 :(得分:0)

你还没有调用这个函数。

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

答案 1 :(得分:0)

最后我找到了一个解决方案,我在这里发布它是为了帮助那些在这方面苦苦挣扎的人。

我的主要问题是我尝试获取一个实例,并且在尝试加载文件之前我没有将其传递给任何变量。

我将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

所以答案是,如果你想在django中使用动态下载路径,你必须查询模型并将输出放在一个变量中。

之后,通过以这种方式调用此变量:

  

variable.field_of_model

您可以参考该记录的任何字段并根据需要使用