Django 将HTML代码作为字符串变量传递给模板以生成PDF

Django 将HTML代码作为字符串变量传递给模板以生成PDF,django,django-templates,django-views,pdf-generation,Django,Django Templates,Django Views,Pdf Generation,我正在开发一个Django应用程序,它解析xlsx输入,处理一系列restapi查询,并在我的Django模板中以表的形式返回查询结果。包含结果表的HTML代码是使用Pandas.to_HTML()功能生成的。HTML代码存储在一个变量(“table”)中,并传递给HTML模板,在那里它显示为{{table | safe}}。这个机制运行得很好。然而,我现在正在努力添加一个按钮,它将生成一个pdf文件供用户下载 注意:我知道在客户端使用JS呈现PDF可能更有意义,但目前的重点是避免这样做 经过一

我正在开发一个Django应用程序,它解析xlsx输入,处理一系列restapi查询,并在我的Django模板中以表的形式返回查询结果。包含结果表的HTML代码是使用Pandas.to_HTML()功能生成的。HTML代码存储在一个变量(“table”)中,并传递给HTML模板,在那里它显示为{{table | safe}}。这个机制运行得很好。然而,我现在正在努力添加一个按钮,它将生成一个pdf文件供用户下载

注意:我知道在客户端使用JS呈现PDF可能更有意义,但目前的重点是避免这样做

经过一番研究,我决定和他一起去。我的解决方案基于文档中包含的示例,但到目前为止没有任何效果

在URL.py中:

urlpatterns=[
[...]
路径('result.pdf',views.PDFView.as_view(),name='PDFView'),
]
在views.py中:

classpdfview(PDFTemplateView):
模板名称='whitelist/listreult.html'
表=无
def获取上下文数据(自身,**kwargs):
返回super(PDFView,self)。获取上下文数据(pagesize='A4',title='Hi there!',table=self.table,date=date.today)
请注意,模板“listresult.html”应为{{table}}变量

最后但并非最不重要的一点是,在listresult.html(我想在其中放置按钮以呈现PDF文件)中,我添加了一个简单的按钮对象:


我的期望是,由于我将“table”变量与PDF url请求一起发送,视图将很好地处理它,并向用户提示一个PDF文件的下载弹出窗口,该文件看起来与最初显示结果的页面完全相同(或几乎完全相同)。然而,我陷入了一个恶性循环,如果我在网站的url引用中添加“table”,我会在显示结果的网站的模板呈现过程中出错(NoReverseMatch表示…,与参数“['table'contents go here]not found”相反的是'PDFview'。另一方面,如果我从url引用中删除“table”参数,结果网站会使用“Download PDF”按钮呈现OK,但单击它后,我会出现运行时错误(因为缺少上下文)


我97%相信我的错误是愚蠢的,但经过x个小时的斗争,我已经准备好接受StackOverflow的判断。

您是否尝试过使用一个名为weasyprint的Python库来创建和呈现PDF?@dotslash227我考虑过,但由于依赖项的数量(CPython!)而推迟了。您认为我应该使用它吗?您在浏览器源代码中看到该按钮的href属性是什么?您希望整个表都在URL中?使用下载按钮呈现HTML的视图和返回PDF的视图是两个独立的视图,因此它们处理两个完全独立的HTTP请求。如果不永久存储某些内容,就不能从一个变量“传递”到另一个变量。因此:将表存储在某个位置(数据库或文件中),保留对它的引用(在用户会话或数据库中),并将该引用作为查询参数传递给URL和第二个视图。@dirkgroten浏览器源代码是
。我希望整个表格都是PDF格式,点击按钮即可访问。