[英]Accessing struct variable outside of {{range .}} scope in golang html template
<!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 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 }
并且发送到模板的帖子片的来源
threadID := r.URL.Path[len("/reply/"):]
replies, err := i.db.Query("SELECT * FROM latest_threads where thread_id="+threadID);
如果只能从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查询之前对其进行解析。 例如:清理您的输入。
您可以将它作为一个结构传递,如下所示:
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.