为了账号安全,请及时绑定邮箱和手机立即绑定

在golang html模板中访问{{range .}}范围之外的结构变量

在golang html模板中访问{{range .}}范围之外的结构变量

Go
牧羊人nacy 2021-07-29 20:53:04
<!DOCTYPE html><html><head>    <title> Test </title></head><body>    <div>        <h2>Reply</h2>        <form action="/post/{{$threadID}}" method="POST">        <input type="text" name="subject" />        <input type="text" name="name" value="Anonymous" />        <input type="text" name="message" />        <input type="submit" value="submit" />        </form>    </div>    <div>        {{range .}}        {{$threadID := .ThreadID}}        <h3>{{.Subject}}</h3>        <h3>{{.Name}}</h3>        <div>{{.DatePosted}}</div>        <div><p>{{.Text}}</p></div>        <br /><br />        {{end}}    </div></body>我有这个模板,页面顶部有一个表单,需要来自任何发送的帖子的 threadID(它们都是相同的,具有特定 threadID 的所有帖子的一部分),这显然不是工作,我唯一的其他想法是{{range .}}    {{if $threadID == nil}}        $threadID := .ThreadID        //build the form same as above    {{end}}    <h3>{{.Subject}}</h3>    <h3>{{.Name}}</h3>    <div>{{.DatePosted}}</div>    <div><p>{{.Text}}</p></div>    <br /><br />{{end}}如果以上任何一个不清楚,这里是 Post 结构和方法。type Post struct {threadID intsubject stringname stringtext stringdate_posted string}func (p *Post) ThreadID()   int    { return p.threadID    }func (p *Post) Subject()    string { return p.subject     }func (p *Post) Name()       string { return p.name        }func (p *Post) Text()       string { return p.text        }func (p *Post) DatePosted() string { return p.date_posted } 以及发送到模板的帖子切片的来源threadID := r.URL.Path[len("/reply/"):]replies, err := i.db.Query("SELECT * FROM latest_threads where thread_id="+threadID);
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

如果只能从 Post 类型本身检索 Thread Id,请考虑将您的帖子切片转换为单独的类型。给它一个 ThreadID 方法,它只返回它包含的第一篇文章的 id,如果不存在则返回零。


type PostList []*Post


func (p PostList) ThreadId() int {

    if len(p) == 0 {

        return 0

    }

    return p[0].ThreadId

}

将此列表传递到模板中。现在您可以从模板中引用它,在{{range .}}子句之外的任何地方。


<form action="/post/{{.ThreadID}}" method="POST">

漏洞利用警告

附带说明一下,Little Bobby Tables的 SQL 查询存在问题。您可能只是将其发布为一个快速示例。如果不是,请注意您的代码是SQL 注入攻击的秘诀。如果线程 ID 是数字,则确保在将其传递到 SQL 查询之前将其解析为数字。例如:清理您的输入。


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 396 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信