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_name | Data | 是(reqd=1) | 是 | 150px | 成员全名 |
image_link | Attach | 否 | 是 | 150px | 成员头像(附件/图片链接) |
bio | Small 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其中parent、parentfield、parenttype是子表文档的标准隐藏字段,分别记录父文档名、父字段名与父 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_title | Data | 页面标题,缺省时模板回退为 “About Us” |
company_introduction | Text Editor | 公司介绍(页面 Hero 区副标题) |
team_members_heading | Data | 团队成员区块标题,缺省回退为 “Team Members” |
team_members_subtitle | Small Text | 团队成员区块副标题 |
team_members | Table → About Us Team Member | 团队成员子表 |
footer | Text Editor | 页面底部附加内容 |
is_disabled | Check | 是否停用页面(默认勾选,即默认关闭) |
父文档通过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。
五、端到端数据流总结
- 录入:Website Manager 在
About Us Settings的Team Members表格中新增行,填写full_name、上传/粘贴image_link、填写bio; - 存储:行数据以
parent=About Us Settings、parentfield=team_members写入子表;保存时触发clear_cache("about"); - 请求:访问
/about,about.py校验is_disabled后注入上下文; - 渲染:
about.html过滤About Us Team Member子表行,逐行输出带 Person 结构化数据的成员卡片; - 测试:test_about_us_settings.py 提供了集成测试入口(当前为空实现,可在此扩展对页面上下文的断言)。
六、扩展建议
- 若需要额外信息(如职位、邮箱、社交链接),在
about_us_team_member.json的fields中追加字段并同步更新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),仅供参考