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

<!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);


牧羊人nacy
浏览 397回答 2
2回答

aluckdog

如果只能从 Post 类型本身检索 Thread Id,请考虑将您的帖子切片转换为单独的类型。给它一个 ThreadID 方法,它只返回它包含的第一篇文章的 id,如果不存在则返回零。type PostList []*Postfunc (p PostList) ThreadId() int {&nbsp; &nbsp; if len(p) == 0 {&nbsp; &nbsp; &nbsp; &nbsp; return 0&nbsp; &nbsp; }&nbsp; &nbsp; return p[0].ThreadId}将此列表传递到模板中。现在您可以从模板中引用它,在{{range .}}子句之外的任何地方。<form action="/post/{{.ThreadID}}" method="POST">漏洞利用警告附带说明一下,Little Bobby Tables的 SQL 查询存在问题。您可能只是将其发布为一个快速示例。如果不是,请注意您的代码是SQL 注入攻击的秘诀。如果线程 ID 是数字,则确保在将其传递到 SQL 查询之前将其解析为数字。例如:清理您的输入。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go