如何用Netlify CMS为Hugo Academic主题生成指定格式内容?
解决方案:Netlify CMS配置Hugo Academic生成嵌套Front Matter
我之前在把Netlify CMS集成到Hugo Academic主题时,也碰到过同样的问题——不知道怎么生成[header]、[[gallery_item]]这类嵌套结构的Front Matter。摸索了一阵后,终于找到了对应的配置方法,分享给你:
一、文章/演讲类内容的config.yml配置
针对你给出的文章示例Markdown,对应的Netlify CMS配置可以这样写,能完美生成所需的嵌套结构:
- name: "posts" # 如果是演讲内容,这里改成"talks",对应Hugo Academic的talks集合 label: "文章" folder: "content/post" create: true slug: "{{year}}-{{month}}-{{day}}-{{slug}}" fields: - {label: "标题", name: "title", widget: "string"} - {label: "发布日期", name: "date", widget: "datetime"} - {label: "最后修改日期", name: "lastmod", widget: "datetime", required: false} - {label: "草稿", name: "draft", widget: "boolean", default: false} - {label: "标签", name: "tags", widget: "list", default: ["academic"]} - {label: "摘要", name: "summary", widget: "text"} # 生成[header]单层嵌套结构 - label: "头部设置" name: "header" widget: "object" fields: - {label: "头部图片路径", name: "image", widget: "string"} - {label: "图片说明(支持Markdown)", name: "caption", widget: "markdown"} # 生成[[gallery_item]]双层数组嵌套结构 - label: "图片集" name: "gallery_item" widget: "list" fields: - {label: "相册ID", name: "album", widget: "string"} - {label: "图片链接", name: "image", widget: "string"} - {label: "图片说明", name: "caption", widget: "string"} - {label: "正文内容", name: "body", widget: "markdown"}
配置说明:
- 用
widget: "object"来处理[header]这种单层的嵌套字段,把相关的子字段都包裹在这个object里; - 用
widget: "list"配合内部的fields定义,来生成[[gallery_item]]这种Hugo风格的数组型嵌套Front Matter,每添加一个列表项就会生成一条[[gallery_item]]条目。
二、About组件的配置问题与解决方案
后来我在配置About组件时也遇到了类似的嵌套难题,这里也把我的解决过程分享出来:
问题示例Markdown
需要生成的About组件Front Matter如下:
+++ # About/Biography widget. widget = "about" active = true date = 2016-04-20T00:00:00 # Order that this section will appear in. weight = 5 # List your academic interests. [interests] interests = [ "Artificial Intelligence", "Computational Linguistics", "Information Retrieval" ] # List your qualifications (such as academic degrees). [[education.courses]] course = "PhD in Artificial Intelligence" institution = "Stanford University" year = 2012 [[education.courses]] course = "MEng in Artificial Intelligence" institution = "Massachusetts Institute of Technology" year = 2009 [[education.courses]] course = "BSc in Artificial Intelligence" institution = "Massachusetts Institute of Technology" year = 2008 +++
对应的config.yml解决方案片段
- file: "content/home/about.md" label: "About" name: "about" fields: - {label: "Widget (Don't modify)", name: "widget", widget: "string", default: "about"} - {label: "是否启用", name: "active", widget: "boolean", default: true } - {label: "设置日期", name: "date", widget: "datetime" } - {label: "权重(控制显示顺序)", name: "weight", widget: "number", default: 5} # 处理[interests]嵌套结构 - label: "研究兴趣" name: "interests" widget: "object" fields: - {label: "兴趣列表", name: "interests", widget: "list", default: ["Artificial Intelligence"]} # 处理[[education.courses]]双层嵌套结构 - label: "教育经历" name: "education" widget: "object" fields: - label: "学历记录" name: "courses" widget: "list" fields: - {label: "学位/课程", name: "course", widget: "string"} - {label: "院校名称", name: "institution", widget: "string"} - {label: "毕业年份", name: "year", widget: "number", default: 2010} - { label: "正文内容", name: "body", widget: "markdown", required: false }
关键要点:
- 对于
[interests]这种内部包含数组的单层嵌套,需要用object组件包裹内部的list字段; - 对于
[[education.courses]]这种嵌套数组,要先创建education这个object,再在其内部用list组件来生成多条courses记录,这样就能正确生成Hugo所需的双层嵌套格式。
内容的提问来源于stack exchange,提问作者Álvaro Loza
相关产品推荐
相关产品推荐

