在golang html模板中访问{range.}}范围之外的结构变量
以及发送到模板的帖子片段的来源在golang html模板中访问{range.}}范围之外的结构变量,html,templates,go,Html,Templates,Go,以及发送到模板的帖子片段的来源 type Post struct { threadID int subject string name string text string date_posted string } func (p *Post) ThreadID() int { return p.threadID } func (p *Post) Subject() string { return p.subject } func (p *Post) Name()
type Post struct {
threadID int
subject string
name string
text string
date_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 }
如果线程ID只能从POST类型本身检索,考虑将您的帖子切片转换成单独的类型。给它一个ThreadID方法,它只返回它包含的第一篇文章的id,如果不存在,则返回零
threadID := r.URL.Path[len("/reply/"):]
replies, err := i.db.Query("SELECT * FROM latest_threads where thread_id="+threadID);
将此列表传递到模板中。现在,您可以在{{range.}
子句之外的任何地方从模板引用它
type PostList []*Post
func (p PostList) ThreadId() int {
if len(p) == 0 {
return 0
}
return p[0].ThreadId
}
利用漏洞警告
作为旁注,它与SQL查询有关。
你可能只是把它作为一个简单的例子。如果不是,请注意,您的代码是一个配方。如果线程ID是数字的,那么请确保在将其传递到SQL查询之前对其进行解析。例如:清理输入。您可以将其作为一个结构传递,如下所示:
<form action="/post/{{.ThreadID}}" method="POST">
那么像这样的事情就行了
layoutData := struct {
ThreadID int
Posts []Post
} {
ThreadID: threadID,
Posts: Posts,
}
试验
回复
{{range$post:=.Posts}
{{$post.Subject}
{{$post.Name}
{{$post.DatePosted}
{{$post.Text}
{{end}
您只需传入threadID和文章片段,然后就可以引用它了。创建表单不需要覆盖任何内容。如何将两个内容传递给模板@Corylanou如果您与我分享如何将切片传递到模板,我将修改该代码以向您展示如何执行该操作。sqlx包()和go数据库sql站点()都有关于如何根据您的DB驱动程序(mySQL/Postgres/etc)执行此操作的示例。这非常有意义!谢谢。我对范围有一些问题,我在范围退出状态1编辑中遇到了意外错误:用{{range$post:=.Posts}}修复了它。是的,很抱歉,我也修复了这个示例。我有同样的问题,但我想访问.Posts范围内的.ThreadID。我不知道我该怎么做。sqli上的道具-因为我知道有人使用复制/粘贴,并且认为他们的问题已经解决了。
<form action="/post/{{.ThreadID}}" method="POST">
layoutData := struct {
ThreadID int
Posts []Post
} {
ThreadID: threadID,
Posts: Posts,
}
<!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 $post := .Posts}}
<h3>{{ $post.Subject}}</h3>
<h3>{{$post.Name}}</h3>
<div>{{$post.DatePosted}}</div>
<div><p>{{$post.Text}}</p></div>
<br /><br />
{{end}}
</div>
</body>