Buffalo框架中模型校验需手动调用ValidateAndSave或validator.Struct并显式传错至模板,不自动扫描tag;须在结构体字段用validations tag(如validations:"required,email"),且仅嵌入pop.Model的结构体生效;错误通过c.Set("errors", err.GetErrors())传递,模板中用{{if .errors.name}}或遍历渲染。

在Buffalo框架中为模型添加数据校验,必须手动触发Pop的ValidateAndSave方法或调用validator.Struct,并显式将错误传入模板——框架不会自动扫描结构体tag或拦截请求体。
给模型结构体添加validation tag
打开你的模型文件(如models/user.go),在字段上添加validations tag。Buffalo的Pop ORM只识别validations字段,不识别binding、validate等其他tag。
例如:【Name字段必须非空,Email字段必须非空且符合邮箱格式】
type User struct {
ID uuid.UUID `json:"id" db:"id"`
Name string `json:"name" db:"name" validations:"required"`
Email string `json:"email" db:"email" validations:"required,email"`
}
注意:validations值之间用英文逗号分隔,不要加空格;email校验依赖go-playground/validator的内置规则,无需额外注册。
在Handler中调用ValidateAndSave并处理错误
进入对应action文件(如actions/users.go),在创建或更新逻辑中使用tx.ValidateAndSave(&user)而非tx.Save(&user)。
第一步:从上下文获取数据库事务对象tx
第二步:调用tx.ValidateAndSave(&user),它会自动读取validations tag并执行校验
第三步:若返回err != nil,说明校验失败或保存失败;此时err是*pop.Error类型,需用err.GetErrors()提取字段级错误map
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
示例代码片段:
if err := tx.ValidateAndSave(&user); err != nil {
c.Set("errors", err.GetErrors())
return c.Render(422, r.HTML("users/new.html"))
}
【ValidateAndSave仅对嵌入pop.Model的结构体生效,普通struct不触发validations tag校验】
在HTML模板中渲染字段错误
打开对应HTML模板(如templates/users/new.html),确认handler已通过c.Set("errors", ...)传入错误数据。
方法一:按字段名直接取错(推荐用于单字段强提示)
{{if .errors.name}}
<span class="error">{{index .errors.name 0}}</span>
{{end}}
方法二:遍历所有错误(适合表单底部统一展示)
{{if .errors}}
<ul class="errors">
{{range $field, $errs := .errors}}
<li>{{$field}}: {{index $errs 0}}</li>
{{end}}
</ul>
{{end}}
注意:.errors是map[string][]string,每个字段对应一个字符串切片,通常取第一个错误信息即可;字段名默认为结构体字段小写形式(如Name → name)。

















