Hugo v0.132.1遍历栏目页面报错:无法迭代nil值求助
解决Hugo Partial模板中遍历栏目页面时的nil迭代错误
问题描述
使用Hugo v0.132.1,尝试在layouts/partials/elements/slider-element.html中遍历content/references/下的页面时,出现错误:
execute of template failed at <where .Site.RegularPages "Section" "references">: error calling where: can’t iterate over <nil>
项目结构:
content/ |-- references/ | |-- ref1.md | |-- ref2.md | |-- ref3.md layouts/ |-- partials/ | |-- elements/ | |-- slider-element.html
Partial核心代码片段:
{{ $references := where .Site.RegularPages "Section" "references" }} <!-- 后续滑块渲染逻辑 -->
核心原因
错误提示.Site.RegularPages为<nil>,通常由两种情况导致:
- Partial调用时未传递有效上下文,模板无法获取站点实例
.Site - 使用
.Site上下文不够稳定,在部分场景下无法正确读取站点数据
解决方案
方案1:使用全局site()函数替代.Site
Hugo 0.112+版本支持全局site()函数,无论Partial接收的上下文是什么,都能稳定获取站点实例。修改Partial第一行代码:
{{ $references := where site.RegularPages "Section" "references" }}
方案2:直接获取栏目页面集合
更精准的方式是直接定位references栏目,获取其下属页面列表,避免where筛选可能出现的问题:
{{ $refSection := site.GetPage "section" "references" }} {{ $references := $refSection.Pages }} {{ if gt (len $references) 0 }} <!-- 原有滑块渲染逻辑 --> {{ else }} <p>No references.</p> {{ end }}
方案3:确保Partial调用时传递正确上下文
检查调用该Partial的模板(如首页、栏目页),确保传递包含站点上下文的参数:
<!-- 在调用模板中传递当前页面上下文 --> {{ partial "elements/slider-element.html" . }}
也可直接传递站点上下文:
{{ partial "elements/slider-element.html" site }}
额外检查项
- 确认
content/references/下的所有.md文件都包含合法Front Matter(至少是空的---分隔符),否则Hugo不会将其识别为有效页面 - 检查站点配置文件(如
config.toml),确保未将references栏目排除在构建范围外 - 若页面设置了
draft: true,构建时需添加--buildDrafts参数才能包含这些页面
内容的提问来源于stack exchange,提问作者Marco Niedermann
相关产品推荐
相关产品推荐

