簡體   English   中英

在golang html模板中訪問{{range。}}范圍之外的struct變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM