如何在 Django 中使用 Hardcopy 在所选目录中创建 pdf 输出文件?
Posted
技术标签:
【中文标题】如何在 Django 中使用 Hardcopy 在所选目录中创建 pdf 输出文件?【英文标题】:How to create a pdf output file in a chosen directory with Hardcopy in Django? 【发布时间】:2020-02-12 16:41:54 【问题描述】:我想将结果自动保存在所选目录中的 pdf 文件中。 我使用 django-hardcopy 模块。目前,我可以显示带有 url 的 pdf。 谢谢你的想法。
这是视图:
from django.conf import settings
from hardcopy.views import PDFViewMixin, PNGViewMixin
class pdf_hardcopy(PDFViewMixin, TemplateView):
download_attachment = True
template_name = 'project/pdf_hardcopy.html'
def get_filename(self):
return "my_file.pdf"
def get_context_data(self, *args, **kwargs):
context = super(pdf_hardcopy, self).get_context_data(*args, **kwargs)
id = self.kwargs['pk']
dossier_media = str(settings.MEDIA_ROOT)
GetDataTeam = Datas.objects.filter(id=id)
context["GetDataTeam"] = GetDataTeam
return context
我的网址:
path('pdf_hardcopy/<int:pk>/', views.pdf_hardcopy.as_view(), name='pdf_hardcopy'),
【问题讨论】:
【参考方案1】:快速浏览一下 repo,看起来没有任何内置方法可以做到这一点。我可能会覆盖PDFViewMixin
的get_file_response
方法。您可以在 views.py
文件 [github link] 中查看当前的实现。
你可以在你的views.py文件中做这样的事情:
class PDFViewAndSaveMixin(PDFViewMixin):
"""Override PDFViewMixin to also save file."""
def get_file_response(self, content, output_file, extra_args):
with open(f'save/location/self.get_filename', ‘w’) as local_file:
local_file.write(output_file)
return super().get_file_response(content, output_file, extra_args)
class pdf_hardcopy(PDFViewAndSaveMixin, TemplateView):
# ...
这是一种相当粗略的保存文件的方法,您可能应该创建一个带有 FileField 的 Django 模型来管理这些文件,而不是简单地将它们直接写入磁盘。请参阅Django docs on managing files。
【讨论】:
感谢您的解决方案。我遵循了您建议的方法,但出现错误:需要一个类似字节的对象,而不是 'str' 我应该在哪里为参数赋值:内容、输出文件? 抱歉,我的文件写入语法混乱。我相信上面编辑的答案应该更接近正确。您不需要分配这些值。它们将通过硬拷贝传递给方法(如果您在浏览器中获取 PDF,您知道这是有效的)。 它正在一点一点地进步。我更新了我的代码。我有一个错误:TypeError:需要一个类似字节的对象,而不是“_TemporaryFileWrapper”。为了纠正这个问题,我写了这个:local_file.write (bytes (str (output_file), encoding = 'utf-8'))。 pdf文件已创建但无法打开。 嗯,你能调试一下吗?output_file
传入这个方法时是什么类型?它有路径吗?也许您可以使用shutil
将文件复制到您的保存位置? from shutil import copyfile
... copyfile(src, dst)
调试后,我得到了这个 (output_file: 以上是关于如何在 Django 中使用 Hardcopy 在所选目录中创建 pdf 输出文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JavaScript 文件中使用 Django 变量?