Revel模板继承需显式调用{{template "layouts/main.html" .}},路径相对app/views/且必须带点号;区块须用{{define}}完整包裹,结构体字段必须首字母大写导出。

Revel 中模板继承必须用 {{template "layouts/main.html" .}},不能靠文件名自动识别
Revel 不像 Django 或 Laravel 那样有约定式 layout 自动注入机制。你写 index.html,它不会自动套进 main.html —— 必须显式调用 {{template "layouts/main.html" .}} 才能触发继承。这个路径是相对于 app/views/ 的,不带扩展名;漏掉点号(即写成 {{template "layouts/main.html"}})会导致当前上下文丢失,所有 .Title、.Data 全部为空。
{{define}} 块必须完整包裹内容,外部直接写 HTML 会被忽略
在 layouts/main.html 里,你得用 {{define "header"}}、{{define "content"}}、{{define "footer"}} 明确划分区块。这些 {{define}} 块之间不能夹杂裸 HTML —— 比如在 {{define "header"}}... 和 {{define "content"}}... 之间写一段 ,这段 不会渲染。常见错误是把公共导航栏写在 {{define}} 外面,结果页面里根本看不到。
-
{{define "header"}}里可以嵌套{{template "partials/_nav.html" .}},但_nav.html文件本身不能含{{define}} - 所有子页面里也要用
{{define "content"}}包裹主体内容,否则{{template "layouts/main.html" .}}找不到可填充的"content"定义,会静默跳过 - 如果某个页面想复用默认 header,但又不想重写整个
{{define "header"}},就留空——Revel 不会报错,而是沿用布局中定义的默认内容
结构体字段必须导出,否则 .Company 这类嵌套切片在模板里访问不到
Revel 使用 Go 标准 text/template,只认首字母大写的导出字段。比如你在控制器里传了 AllData{Company: []Company{...}},但结构体定义是:
type alldata struct {
company []company // ❌ 小写 → 模板不可见
}
那模板里写 {{range .Company}} 或 {{.Company}} 全部失效,且不报错,只渲染为空。必须改成:
type AllData struct {
Company []Company // ✅ 大写
}
type Company struct {
Tradetotals float64 // ✅ 同样要大写
}
- 嵌套结构体类型名和字段名都必须导出,缺一不可
- 切片本身为
nil时,{{range}}会安静跳过,不会 panic,但你要主动判断是否需要 fallback 提示 - 若字段名拼错(如写成
.Comapny),Revel 也静默忽略,排查时建议先在控制器里revel.INFO.Printf("%+v", data)确认传入值
模板函数传参要小心上下文覆盖,set 和 field 的作用域很窄
set 函数只能在当前模板及其 {{template}} 包含的子模板中生效,不能跨页面传递。比如你在 index.html 里 {{set ."pageTitle" "首页"}},然后 {{template "layouts/main.html" .}},但 main.html 里读不到 .pageTitle —— 因为 set 修改的是传入的那个 . 的副本,而 main.html 是在另一个 {{define}} 块里执行的,上下文已切换。
-
field "user.Name" .必须确保控制器里已调用c.Validation.Error("user.Name"),否则$field.Error永远为空字符串 -
eq .Status "active"中的.Status若未传入或字段名错,Revel 不报错也不提示,只当 false 处理 - 自定义函数(如
formatDate)必须在app/init.go的init()里注册,改完要重启服务才生效
Revel 的模板继承表面简单,真正卡住人的地方往往不是语法,而是上下文传递的隐式规则和字段可见性的静默失败——这两个点没盯住,调试时容易反复怀疑是不是路径写错了,其实问题藏在结构体定义或 set 的作用域里。











