2013-01-04 33 views
2

我正在使用模板成功获取所有数据并显示在表中。我在此代码中使用Go查询数据存储,并将Membership作为实体类型。将* datastore.Key添加到切片

在html页面中,显示所有数据,但不显示键。

我试图将Key *datastore.Key作为属性添加到Membership结构中,但仍然没有运气。

这里是我的代码:

package hello 

import (
    "appengine" 
    "appengine/datastore" 
    "html/template" 
    "net/http" 
    "time" 
)   

type Membership struct { 
    Key *datastore.Key 
    Author string 
    Content string 
    FirstName string 
    LastName string 
    Address string 
    Email string 
    Grade string 
    Date time.Time 
} 

func init() { 
    http.HandleFunc("/", members) 
} 

func members(w http.ResponseWriter, r *http.Request) { 
    c := appengine.NewContext(r) 
    q := datastore.NewQuery("Membership").Order("-Date") 
    memberships := make([]Membership, 0, 10) 
    if _, err := q.GetAll(c, &memberships); err != nil { 
     http.Error(w, err.Error(), http.StatusInternalServerError) 
     return 
    } 
    if err := membersTemplate.Execute(w, memberships); err != nil { 
     http.Error(w, err.Error(), http.StatusInternalServerError) 
    } 
} 

var membersTemplate = template.Must(template.New("page").Parse(membersTemplateHTML)) 

const membersTemplateHTML = ` 
<html> 
    <body> 
    <table><tr><th>Key</th><th>Name</th><th>Email</th><th>Adress</th><th>Grade</th></tr> 
     {{range .}} 
     <tr> 
      <td>{{.Key}}</td> 
      <td>{{.FirstName}} {{.LastName}}</td> 
      <td>{{.Email}}</td> 
      <td>{{.Address}}</td> 
      <td>{{.Grade}}</td> 
     </tr> 
     {{end}} 
    </table> 
    </body> 
</html>` 

回答

3

您需要的关键分配给Key属性:

func members(w http.ResponseWriter, r *http.Request) { 
    .... 
    if keys, err := q.GetAll(c, &memberships); err != nil { 
     http.Error(w, err.Error(), http.StatusInternalServerError) 
     return 
    } 
    // Loop over the membership and add the keys 
    for i := range memberships { 
     memberships[i].Key = keys[i] 
    } 
    .... 
} 

您还可能需要禁用存储在数据存储中的Key属性:

type Membership struct { 
    Key *datastore.Key `datastore:"-"` 
    .... 
} 

Btw。如果你想在HTML中显示*datastore.Key,你应该在之前使用Encode()

+0

感谢这个解决方案,它的工作原理! ;-) – sagit

+0

@ user1949730不要忘记标记为答案。只需点击勾号。很高兴它对你有效 :) – Testuser