
在 Beego 模板中,通过 {{template}} 调用子模板时,传入的参数会直接成为子模板中的 .(当前上下文),而非嵌套字段如 .option;需直接用 . 访问该值,并注意避免字段访问错误。
在 beego 模板中,通过 `{{template}}` 调用子模板时,传入的参数会直接成为子模板中的 `.`(当前上下文),而非嵌套字段如 `.option`;需直接用 `.` 访问该值,并注意避免字段访问错误。
在 Beego(基于 Go html/template)中,模板间的数据传递依赖于 {{template}} 动作的上下文机制。当你写:
{{template "alternative_src.html" $option}}
Go 模板引擎会将 $option 的值本身(例如一个字符串 "xxx" 或结构体实例)设为被调用模板 alternative_src.html 中的 .(即当前作用域根对象)。这意味着:子模板中不应写作 .option,而应直接使用 .。
✅ 正确的 alternative_src.html 写法如下:
{{if compare . ""}}
<option value="" selected></option>
{{else}}
<option value=""></option>
{{end}}
{{if compare . "xxx"}}
<option value="xxx" selected>xxx</option>
{{else}}
<option value="xxx">xxx</option>
{{end}}
⚠️ 注意事项:
- . 在子模板中不是原始数据结构的“字段容器”,而是你显式传入的值(本例中是 $option 的值);
- 若 $option 是结构体(如 {Value: "xxx", Label: "XXX"}),则可在子模板中使用 .Value 或 .Label —— 但前提是传入的是结构体,且你确认其字段存在;
- compare 是 Beego 自定义函数(等价于 ==),确保已在模板中注册(Beego 默认已内置);
- 避免常见误区:不要假设子模板自动继承父模板的 . 或添加命名空间前缀(如 .option),这会导致 can't evaluate field option in type string 错误。
? 进阶提示:若需同时传递多个值,可构造匿名结构体或 map:
{{template "alternative_src.html" (dict "opt" $option "index" $index)}}
并在 alternative_src.html 中使用 $.opt 和 $.index(注意 $. 表示根模板上下文,此时 . 是 dict 对象)——但此方式需额外注册 dict 函数,简单场景推荐优先使用单一值传递 + . 直接访问。
总之,牢记模板复用的核心原则:{{template "name" pipeline}} 中的 pipeline 结果 = 子模板里的 .。理解这一点,即可精准控制数据流向,写出健壮、可维护的 Beego 模板逻辑。











