第29讲 Gin模板渲染补充+表单设置
本讲基于视频实际讲解内容整理
一、本讲概述
本讲是对模板渲染的补充,并专门讲解表单在模板中的写法。前面我们渲染过列表和页面,本讲补充模板里更实用的语法(自动转义、with、比较、模板函数),以及如何在模板中写出能正确提交数据的表单。
二、模板渲染补充
2.1 自动转义(安全特性)
Go 的 html/template 会自动转义变量,防止 XSS:
HTML
<!-- 如果 .content 含有 <script> 会被转义成纯文本 -->
<p>{{.content}}</p>
老师提醒:这是好事,能防注入。但如果确实要输出 HTML(比如富文本),需要特殊处理,初学阶段先理解"默认转义是安全的"即可。
2.2 with:简化深层字段访问
访问嵌套字段时,用 with 可以省略前缀:
HTML
{{with .user}}
<p>姓名:{{.Name}}</p>
<p>年龄:{{.Age}}</p>
{{end}}
等价于 {{.user.Name}}、{{.user.Age}},但更简洁。
2.3 比较运算
模板里可以用 eq / ne / lt / gt / le / ge:
HTML
{{if eq .role "admin"}}
<a href="/admin">进入后台</a>
{{else}}
<p>普通用户</p>
{{end}}
| 函数 | 含义 |
|---|---|
eq |
等于 == |
ne |
不等于 != |
lt |
小于 < |
gt |
大于 > |
le |
小于等于 |
ge |
大于等于 |
2.4 自定义模板函数(FuncMap,了解)
Go
r.SetFuncMap(template.FuncMap{
"safe" func(s string) template.HTML { return template.HTML(s) },
})
r.LoadHTMLGlob("templates/*")
老师说明:进阶用法,初学了解即可。常用来自定义日期格式化、字符串处理等。
三、表单设置
3.1 表单基本结构
HTML
<form method="post" action="/login">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<button type="submit">登录</button>
</form>
| 属性 | 说明 |
|---|---|
method |
get 或 post(提交数据用 post) |
action |
表单提交到的后端路由 |
input name |
后端靠 name 取值,name 必须写对 |
老师强调:
name属性最关键!后端是用name来取表单值的,不是id。很多同学漏写name导致取不到值。
3.2 预填表单值(编辑场景)
从后端传数据到模板,用 value="{{.字段}}" 预填:
HTML
<form method="post" action="/post/update">
标题:<input type="text" name="title" value="{{.post.Title}}"><br>
内容:<textarea name="content">{{.post.Content}}</textarea><br>
<button type="submit">保存</button>
</form>
3.3 下拉框、单选、复选
HTML
<!-- 下拉框 -->
<select name="category">
<option value="1">技术</option>
<option value="2">生活</option>
</select>
<!-- 单选 -->
<input type="radio" name="gender" value="male"> 男
<input type="radio" name="gender" value="female"> 女
<!-- 复选 -->
<input type="checkbox" name="hobby" value="code"> 编程
<input type="checkbox" name="hobby" value="music"> 音乐
老师提醒:单选/复选靠相同
name分组;后端取复选框会得到多个同 name 的值,要用c.QueryArray或c.PostFormArray。
3.4 隐藏字段
HTML
<input type="hidden" name="id" value="{{.post.ID}}">
隐藏字段常用于传 ID 等不需要用户看到、但后端需要的数据。
四、本讲小结
| 知识点 | 要点 |
|---|---|
| 自动转义 | html/template 默认防 XSS |
with |
简化嵌套字段访问 |
| 比较 | eq/ne/lt/gt 等函数 |
表单 name |
后端靠 name 取值,必须写 |
| 预填 | value="{{.字段}}" |
| 单选/复选 | 相同 name 分组;复选用 PostFormArray |
五、课后练习
- 写一个登录表单,包含
username、password(password 类型),提交到/login - 在模板中故意插入一段含
<script>的内容,观察是否被转义 - 用
{{with .user}}改写一段嵌套字段的展示 - 用
{{if eq .role "admin"}}区分管理员/普通用户显示 - 写一个"编辑帖子"表单,用
value="{{.post.Title}}"预填标题 - 写一个含单选(性别)和复选(爱好)的表单,思考后端如何取值