一尘不染

Golang GAE-胡子的结构中的intID

go

这是该应用程序的示例。基本代码位于:golang-code / handler / handler.go(在主题之后应显示ID!)

我试图在Google Appengine上的Golang中建立一个小型博客系统,并使用Mustache作为模板引擎。

所以,我有一个结构:

type Blogposts struct {
    PostTitle   string
    PostPreview string
    Content     string
    Creator     string
    Date        time.Time
}

数据通过传递给GAE

    datastore.Put(c, datastore.NewIncompleteKey(c, "Blogposts", nil), &blogposts)

因此,GAE自动分配一个intID(int64)。现在我试图获得最新的博客文章

// Get the latest blogposts
c := appengine.NewContext(r)
q := datastore.NewQuery("Blogposts").Order("-Date").Limit(10)

var blogposts []Blogposts
_, err := q.GetAll(c, &blogposts)

直到那里一切正常,但是当我尝试访问intID(或stringID,无论如何)时,我无权访问此:-(

<h3><a href="/blog/read/{{{intID}}}">{{{PostTitle}}}</a></h3>

(PostTitle起作用,intID不起作用,我已经尝试了数千种东西,没有任何作用:-()

有人知道吗?太好了!

编辑:我用胡子。

http://mustache.github.com/

在代码中,我使用:

x["Blogposts"] = blogposts
data := mustache.RenderFile("templates/about.mustache", x)
sendData(w, data) // Equivalent to fmt.Fprintf

然后可以使用{{{Content}}}或{{{PostTitle}}}等在.mustache模板中访问数据。


阅读 303

收藏
2020-07-02

共1个答案

一尘不染

intID 是Key的内部属性,而不是struct,可以通过getter访问:

id := key.IntID()

GetAll返回[]*Key,您没有使用它:

_, err := q.GetAll(c, &blogposts)

解决此问题的一种方法是创建一个既包含帖子信息又包含关键信息的viewmodel结构(未经测试,但这是要点):

  //... handler code ...

  keys, err := q.GetAll(c, &blogposts)
  if err != nil {
    http.Error(w, "Problem fetching posts.", http.StatusInternalServerError)
    return
  }

  models := make([]BlogPostVM, len(blogposts))
  for i := 0; i < len(blogposts); i++ {
    models[i].Id = keys[i].IntID()
    models[i].Title = blogposts[i].Title
    models[i].Content = blogposts[i].Content
  }

  //... render with mustache ...
}

type BlogPostVM struct {
  Id int
  Title string
  Content string
}
2020-07-02