如何在Django中实现表单提交后动态HTML转PDF并新标签打开?
实现Django表单提交后生成PDF并在新标签页打开的方案
1. 安装PDF生成依赖
首先安装WeasyPrint,它能将HTML模板精准渲染为标准PDF文档:
pip install weasyprint
2. 修改视图函数处理表单提交与PDF生成
更新dogovor/views.py,添加POST请求处理逻辑,完成表单验证、模板渲染与PDF生成:
from django.http import HttpResponse from django.template.loader import render_to_string import weasyprint from django.shortcuts import render from .forms import DogovorUserForm def formadogovora_user(request): if request.method == 'POST': form = DogovorUserForm(request.POST) if form.is_valid(): # 整理表单数据为模板可用的上下文 dogovor_data = form.cleaned_data # 渲染HTML模板 html_content = render_to_string('dogovor/dogovortemplate.html', {'dogovor': dogovor_data}) # 生成PDF响应 response = HttpResponse(content_type='application/pdf') # 设置响应头,让浏览器在新标签页打开PDF而非直接下载 response['Content-Disposition'] = 'inline; filename="agreement.pdf"' weasyprint.HTML(string=html_content).write_pdf(response) return response else: form = DogovorUserForm() return render(request, 'dogovor/formadogovora.html', {'form': form})
3. 调整表单标签实现新标签页提交
修改formadogovora.html中的<form>标签,添加target="_blank"属性,确保表单提交后在新标签页加载PDF:
{% extends 'base.html' %} {% load static %} {% block title %}Form of agreement{% endblock %} {% block content %} <h1>Form of agreement</h1> <form method="post" target="_blank"> {% csrf_token %} {{ form.as_p }} <button type="submit">Generate document</button> </form> {% endblock %}
4. 验证模板变量匹配
当前dogovortemplate.html中使用的{{ dogovor.sellername }}、{{ dogovor.yachtclass }}变量,与视图传递的dogovor_data字典键名完全匹配,无需额外修改模板内容。
完成以上配置后,访问mysite.com/dogovor/formadogovora/(注意URL为配置的路由路径,无需加.html后缀),填写表单并点击按钮,即可在新标签页生成并展示包含表单数据的PDF协议文档。
内容的提问来源于stack exchange,提问作者Serega Derevnya
相关产品推荐
相关产品推荐

