2016-11-14 165 views
0

如何设置一个动态的下载路径通过改变这部分的Django:设置动态下载路径的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媒体/用户_ {ID} /filename.pdf

我希望用户下载特定的pdf文件时,他点击了正确的项目。 但我不知道如何使用用户ID,并把它放在打开的下载用户想要的一个PDF格式的正确。

+0

这是非常不清楚使用它。你的功能是做什么的?它返回一个字符串吗?你真的在任何地方打电话吗? –

+0

我并没有要求整个项目的解决方案。我只是想知道是否有任何方法可以通过open(...)函数中的直接字符串路径来传递其他内容。 –

+0

当然可以。如果你有一个函数返回一个字符串,并且你在那里调用它,Python不会知道它的区别。你显然不在那里做那些事情,但是没有看到真正的代码,我们不知道是什么。 –

回答

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 

因此,答案是,如果你想在Django你要查询你的模型,并把输出变量的dynamicaly下载路径。

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

variable.field_of_model

您可以参考该记录的任何领域,只要你想

0

您还没有调用该函数。

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

我这样做,它给了我错误: FileDescriptor的对象不可调用 –