用途
Frappe Printing & Templates 用于在 Frappe 框架中创建打印格式(Print Format)、邮件模板和文档模板,全部基于 Jinja 模板引擎。它适合为指定 DocType 定制打印布局、构建带动态内容的邮件模板、从文档生成 PDF、在网页中使用 Jinja 模板,以及配置信头(Letter Head)用于品牌展示。
主要能力
- 创建 Jinja 打印格式:通过 awesomebar 新建 Print Format,设置唯一名称、关联目标 DocType、选择标准(Standard)或自定义(Custom)格式、设置 Print Format Type 为 Jinja,并编写 Jinja HTML。
- 格式类型选择:标准格式(开发者模式,保存为 JSON,版本受控,用户不可自定义)、Print Format Builder(拖拽式 UI,存于数据库,用户可自定义)、自定义 HTML(Jinja,可选版本控制)。
- 使用 Frappe Jinja API:在模板中获取文档(frappe.get_doc)、列表查询(frappe.get_all 忽略权限 / frappe.get_list 权限感知)、单值查询(frappe.db.get_value)、设置值(frappe.db.get_single_value),以及格式化(frappe.format、frappe.format_date)、会话与上下文(frappe.session.user、frappe.get_fullname()、frappe.lang、_() 翻译)、URL(frappe.get_url())。
- 构建邮件模板:使用 Jinja 动态渲染收件人、订单信息、明细列表和总计。
- 程序化生成 PDF:使用 frappe.get_print(as_pdf=True)生成 PDF 内容,frappe.attach_print 附加到文档,frappe.sendmail 作为附件发送。
- 配置信头:在 Letter Head 列表中新建,上传公司 logo 和页眉图片,设为公司默认,打印格式自动显示。
- 使用 Jinja 过滤器:upper、truncate、striptags、safe、length、first、join、round、default、tojson 等。
- 模板继承与宏:通过 macros 定义可复用片段,并在打印格式中导入使用。
使用方式
- 选择格式类型(标准 / Print Format Builder / 自定义 HTML)。
- 通过 awesomebar 新建 Print Format,设置名称、DocType、Standard、Custom Format、Print Format Type = Jinja,编写 Jinja HTML。
- 在模板中调用 Frappe Jinja API 获取数据、格式化字段、处理会话与翻译。
- 构建邮件模板,使用 Jinja 动态渲染内容。
- 使用 frappe.get_print、frappe.attach_print、frappe.sendmail 程序化生成和发送 PDF。
- 配置 Letter Head 并设为默认。
- 使用 Jinja 过滤器、宏和模板继承。
适用场景
- 为 Frappe 文档创建自定义打印格式。
- 构建带动态内容的邮件模板。
- 从文档生成 PDF。
- 在网页中使用 Jinja 模板。
- 配置信头用于品牌展示。
- 使用 Print Format Builder。
限制与注意事项
- 需要提供目标 DocType、布局要求(字段、表格、页眉)、格式类型(标准或自定义)、信头/品牌要求、PDF 生成需求。
- 模板语法错误需检查 Jinja 分隔符({{ }}、{% %})和未闭合块。
- 字段未渲染需核对字段名与 DocType schema,检查子表访问方式。
- PDF 生成失败需检查 wkhtmltopdf 安装和 Jinja 有效性。
- PDF 样式问题应使用内联样式,避免复杂 CSS,先在 Print View 测试。
- 权限错误需区分 frappe.get_all(无权限检查)与 frappe.get_list。
- 应使用真实数据测试,优雅处理缺失字段({{ doc.field or '' }} 或 {% if doc.field %})。
- 图片使用 frappe.utils.get_url(),不要硬编码 URL。
- 用户生成内容使用 {{ value | e }} 防止 XSS。
- 保持样式内联,PDF 生成器不支持外部 CSS。
- 常见错误包括:Jinja 语法错误、缺少过滤器、硬编码 URL、子表访问错误、复杂 CSS、未处理 None 值。
- 应用级 hooks 和结构问题应转至 frappe-app-development;DocType schema 问题应转至 frappe-doctype-development。
- 参考资料:references/jinja.md(Jinja 模板与 Frappe Jinja API)、references/printing.md(打印格式与 PDF 生成)。