如何在 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,看起来没有任何内置方法可以做到这一点。我可能会覆盖PDFViewMixinget_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: ) (content:b'\n\n\n \n\n \n' ) (type(output_file)= )

以上是关于如何在 Django 中使用 Hardcopy 在所选目录中创建 pdf 输出文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中使用 $.post?

如何在 Django 中使用模式?

如何在 JavaScript 文件中使用 Django 变量?

如何使用 Django Rest Framework 在 Django 中进行操作日志记录

如何在 Django 中使用 memcached?

如何在静态文件中使用 django 模板语法