revel模板需用内置函数动态渲染数据、表单和逻辑;eq支持宽松相等判断,set定义局部变量,append追加切片元素;field结合option/radio生成带校验的表单控件;自定义函数需在init.go注册并重启生效。

在Revel框架中编写HTML模板时,需要动态渲染数据、生成表单元素、做条件判断或构造链接,这些操作必须依赖模板函数完成,否则只能写死内容或手动拼接字符串。
使用内置模板函数渲染基础逻辑
Revel内置的模板函数直接暴露在模板作用域中,无需导入即可调用。最常用的是eq用于相等判断,它比原生Go模板的==更简洁且支持类型宽松比较。
在模板中写{{if eq .Status "active"}}<span class="badge">已启用</span>{{end}},就能根据结构体字段值动态插入内容。注意这里.Status必须是模板上下文里已传入的变量,【若字段名拼错或未传入,Revel不会报错,而是静默渲染为空】。
set函数用于在当前模板作用域内定义新变量,比如{{set ."pageTitle" "用户管理页"}},后续可用{{.pageTitle}}引用。这个变量只在当前模板及其子模板中有效,不影响控制器传入的原始数据。
append用来向切片追加元素,常配合range遍历使用:{{append ."scripts" "js/chart.js"}},之后在{{range .scripts}}块中就能逐个输出script标签。
用field+option/radio构建带校验的表单控件
Revel的field函数是表单开发的核心辅助工具,它自动提取字段名、ID、当前值、错误信息等,避免手写冗余属性。
方法一:结合option生成下拉菜单
写法:{{with $field := field "user.Role" .}}<select name="{{$field.Name}}">{{option $field "admin" "管理员"}}{{option $field "editor" "编辑员"}}</select>{{end}}。这会自动为选中项添加selected属性,并把错误类名注入父级容器。
方法二:用radio生成单选按钮组
写法:{{with $field := field "user.Gender" .}}{{radio $field "M"}} 男 {{radio $field "F"}} 女{{end}}。每个radio调用会检查当前值是否匹配,匹配则添加checked属性。
注意:field函数依赖控制器中设置的Validation错误信息。如果没调用c.Validation.Error("user.Role"),$field.Error始终为空字符串。
自定义模板函数注册与调用
Revel允许在应用初始化阶段注册自定义模板函数,适用于复用率高、逻辑复杂的字符串处理或URL生成场景。
第一步:在app/init.go的init()函数中添加注册代码:revel.TemplateFuncs["formatDate"] = func(t time.Time) string { return t.Format("2006-01-02") }。
第二步:重启服务使注册生效。Revel不会热重载模板函数,改完必须重启进程。
第三步:在模板中直接调用:{{formatDate .CreatedAt}}。该函数接收一个time.Time参数并返回格式化后的字符串,无需额外判断空值——但【若传入nil时间,运行时会panic】,建议在函数体内加if t.IsZero()防护。











