news 2026/9/15 21:32:43

Frappe About Us Team Member 子表 DocType 实战指南:About Us 页团队成员字段配置与页面渲染原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Frappe About Us Team Member 子表 DocType 实战指南:About Us 页团队成员字段配置与页面渲染原理

Frappe About Us Team Member 子表 DocType 实战指南:About Us 页团队成员字段配置与页面渲染原理

【免费下载链接】frappeLow code web framework for real world applications, in Python and Javascript项目地址: https://gitcode.com/GitHub_Trending/fr/frappe

本篇指南以 Frappe 框架中About Us Team Member子表 DocType 为对象,讲解如何在 About Us 页面中录入与展示团队成员信息。你将掌握其字段结构、子表(Child Table)机制、与About Us Settings的关联方式,以及页面从数据到 HTML 的完整渲染链路。

一、什么是 About Us Team Member

About Us Team Member是 Frappe 内置的一个子表 DocType(Child Table),定义在 frappe/website/doctype/about_us_team_member/ 目录下,其 README 用一句话说明了它的用途:

Details of team member for About Us page.

即:用于记录 About Us(关于我们)页面展示的团队成员详情。它本身不能独立创建和访问,必须作为父文档About Us Settings的表格字段(Table 字段)嵌入使用,实际存储时挂在父文档行中。

二、字段结构详解(源自 about_us_team_member.json)

该 DocType 的完整定义位于 about_us_team_member.json,共 3 个业务字段:

字段名字段类型是否必填是否列表展示宽度说明
full_nameData是(reqd=1)150px成员全名
image_linkAttach150px成员头像(附件/图片链接)
bioSmall Text是(reqd=1)200px成员个人简介

关键定义要点:

  • istable: 1—— 声明这是一个子表 DocType,不会出现在全局文档列表中,也不能单独设置权限(JSON 中permissions: []为空);
  • editable_grid: 1—— 允许在父表单的表格网格内直接编辑子表行;
  • module: "Website"—— 归属 Website 模块;
  • sort_field: "creation"/sort_order: "DESC"—— 子表数据默认按创建时间倒序。

2.1 类型化属性(DF 注解)

在 about_us_team_member.py 中,Frappe 通过自动生成的类型注解声明了字段的类型契约:

if TYPE_CHECKING: from frappe.types import DF bio: DF.SmallText full_name: DF.Data image_link: DF.Attach | None parent: DF.Data parentfield: DF.Data parenttype: DF.Data

其中parentparentfieldparenttype是子表文档的标准隐藏字段,分别记录父文档名、父字段名与父 DocType 名,用于把子表行回挂到父文档上。image_link声明为可空(| None),与 JSON 中未设reqd一致。

2.2 控制器类

class AboutUsTeamMember(Document): _DOCTYPE_NAME = "About Us Team Member" ... pass

控制器继承frappe.model.document.Document,当前版本未实现任何自定义逻辑,是一个纯数据载体——这也说明成员数据本身不需要业务规则,展示逻辑完全由父文档与网页模板承担。

三、父文档:About Us Settings 如何承载团队成员

团队成员子表由单例(Single)DocType About Us Settings 通过 Table 字段承载:

{ "fieldname": "team_members", "fieldtype": "Table", "label": "Team Members", "options": "About Us Team Member" }

team_members字段的options直接指向About Us Team Member。About Us Settings 中与团队展示相关的字段还包括:

字段类型作用
page_titleData页面标题,缺省时模板回退为 “About Us”
company_introductionText Editor公司介绍(页面 Hero 区副标题)
team_members_headingData团队成员区块标题,缺省回退为 “Team Members”
team_members_subtitleSmall Text团队成员区块副标题
team_membersTable → About Us Team Member团队成员子表
footerText Editor页面底部附加内容
is_disabledCheck是否停用页面(默认勾选,即默认关闭)

父文档通过on_update钩子在每次保存时调用frappe.website.utils.clear_cache("about")清理页面缓存,保证修改立即生效(见 about_us_settings.py)。

3.1 权限配置

About Us Settings 的permissions中仅授予Website Manager角色完整的创建/读取/写入/分享/邮件/打印权限(见 about_us_settings.json 中role: "Website Manager"的权限条目)。因此添加团队成员的实际操作路径是:以 Website Manager 身份登录后在Website > About Us Settings中编辑Team Members表格。

四、About Us 页面的渲染原理

4.1 路由与上下文注入

访问/about时,Frappe 路由到 frappe/www/about.py:

def get_context(context): context.doc = frappe.get_cached_doc("About Us Settings") if context.doc.is_disabled: frappe.local.flags.redirect_location = "/404" raise frappe.Redirect return context
  • 使用frappe.get_cached_doc读取缓存的 About Us Settings 单例;
  • is_disabled被勾选,直接 302 重定向到/404
  • sitemap = 1声明该页面可被纳入站点地图索引。

4.2 模板渲染成员卡片

页面模板 frappe/www/about.html 中遍历子表行生成成员卡片:

{% for d in doc.get({"doctype":"About Us Team Member"}) %} <div class="col-md-2 mt-4" itemscope itemtype="http://schema.org/Person"> <img class="card card-md w-100" src="{{ d.image_link }}" itemprop="image"> <h5 class="mt-3" itemprop="name">{{ d.full_name }}</h5> <p class="small mt-2" itemprop="description">{{ d.bio }}</p> </div> {% endfor %}

值得注意的实现细节:

  • 通过doc.get({"doctype":"About Us Team Member"})过滤子表行,即使以后team_members字段被调整也不影响取值逻辑;
  • 每个成员卡片带schema.org/Person结构化标记(itemprop="image" / "name" / "description"),利于搜索引擎理解页面内容;
  • 头像使用card样式类包裹,w-100保证整列宽度自适应。

about_us_settings.js还提示:About Us 页面的固定链接为/about

五、端到端数据流总结

  1. 录入:Website Manager 在About Us SettingsTeam Members表格中新增行,填写full_name、上传/粘贴image_link、填写bio
  2. 存储:行数据以parent=About Us Settingsparentfield=team_members写入子表;保存时触发clear_cache("about")
  3. 请求:访问/aboutabout.py校验is_disabled后注入上下文;
  4. 渲染about.html过滤About Us Team Member子表行,逐行输出带 Person 结构化数据的成员卡片;
  5. 测试:test_about_us_settings.py 提供了集成测试入口(当前为空实现,可在此扩展对页面上下文的断言)。

六、扩展建议

  • 若需要额外信息(如职位、邮箱、社交链接),在about_us_team_member.jsonfields中追加字段并同步更新about_us_team_member.py的类型注解,再在about.html模板对应位置输出;
  • 若希望成员子表支持更多自定义业务校验,可在AboutUsTeamMember控制器中实现validate等方法;
  • 由于image_link为 Attach 类型,可在页面中使用{{ d.image_link }}直接输出文件 URL,也可结合 Frappe 的文件接口做图片裁剪与懒加载优化。

通过本指南,你可以完整掌握 Frappe 中“子表 DocType + Single 父文档 + 网页模板”这一经典组合,并能在自己的项目中照此模式快速搭建团队介绍、合作伙伴、荣誉奖项等同类列表型展示页面。

【免费下载链接】frappeLow code web framework for real world applications, in Python and Javascript项目地址: https://gitcode.com/GitHub_Trending/fr/frappe

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 21:31:00

Joplin 笔记导入中的 YAML Frontmatter 标签缩进规范化机制解析

Joplin 笔记导入中的 YAML Frontmatter 标签缩进规范化机制解析 【免费下载链接】joplin Joplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS. 项目地址: https://gitcode.com/GitHub_Trending/jo/joplin …

作者头像 李华
网站建设 2026/9/15 21:30:14

`openclaw node` 无头节点主机:CLI 参考与源码级解析

openclaw node 无头节点主机&#xff1a;CLI 参考与源码级解析 【免费下载链接】openclaw The AI that really does things. Any OS. Any Platform. The lobster way. &#x1f99e; 项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw 导读 openclaw node 是…

作者头像 李华
网站建设 2026/9/15 21:29:58

水电工控网络安全风险全解析:从架构弱点到防护体系落地

1. 为什么要单独研究水电行业的工控网络安全干了这些年工控安全项目&#xff0c;我越来越觉得水电行业是一个被严重低估的细分领域。很多人一听“电力行业安全”&#xff0c;首先想到的是火电厂、变电站或者电网调度&#xff0c;水电往往被一笔带过。但真把水电厂的工控网络结构…

作者头像 李华
网站建设 2026/9/15 21:29:33

Midscene 自然语言 UI 自动化测试快速上手

Midscene 自然语言 UI 自动化测试快速上手 【免费下载链接】midscene GUI Agent for E2E Testing 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene Midscene 是一个开源的 GUI Agent&#xff0c;靠视觉 AI 完成 Web、移动端和桌面的 UI 自动化测试与界面操…

作者头像 李华
网站建设 2026/9/15 21:28:57

Flutter混合开发中dart_apitool的鸿蒙API兼容性实践

1. 项目背景与核心价值在Flutter混合开发领域&#xff0c;API兼容性一直是困扰开发者的痛点问题。特别是在鸿蒙&#xff08;HarmonyOS&#xff09;生态中&#xff0c;当Flutter插件需要同时维护Android、iOS和鸿蒙三个平台时&#xff0c;API的破坏性变更&#xff08;Breaking C…

作者头像 李华
网站建设 2026/9/15 21:27:23

3个真实案例对比评测:在c盘做网站可以吗

3个真实案例对比评测:在c盘做网站可以吗 域名解析报错,服务器连不上,后台一片空白。这是很多刚接触建站的朋友最崩溃的时刻。你明明照着教程敲了代码,配置了环境,结果一访问 localhost 或者刚买的域名,就是打不开。别慌,这种“域名服务器搞不懂”的错觉,往往源于一个最基础的误区:…

作者头像 李华