You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:01:34