将*datastore.Key添加到切片中

huangapple go评论118阅读模式
英文:

Add *datastore.Key to slice

问题

我成功地获取了所有的数据,并使用模板在表格中显示出来。我在这段代码中使用Go语言查询数据存储,实体类型为Membership。

在HTML页面中,所有的数据都被显示出来,但是键值没有显示。

我尝试将Key *datastore.Key作为Membership结构体的属性添加进去,但是仍然没有成功。

以下是我的代码:

  1. package hello
  2. import (
  3. "appengine"
  4. "appengine/datastore"
  5. "html/template"
  6. "net/http"
  7. "time"
  8. )
  9. type Membership struct {
  10. Key *datastore.Key
  11. Author string
  12. Content string
  13. FirstName string
  14. LastName string
  15. Address string
  16. Email string
  17. Grade string
  18. Date time.Time
  19. }
  20. func init() {
  21. http.HandleFunc("/", members)
  22. }
  23. func members(w http.ResponseWriter, r *http.Request) {
  24. c := appengine.NewContext(r)
  25. q := datastore.NewQuery("Membership").Order("-Date")
  26. memberships := make([]Membership, 0, 10)
  27. if _, err := q.GetAll(c, &memberships); err != nil {
  28. http.Error(w, err.Error(), http.StatusInternalServerError)
  29. return
  30. }
  31. if err := membersTemplate.Execute(w, memberships); err != nil {
  32. http.Error(w, err.Error(), http.StatusInternalServerError)
  33. }
  34. }
  35. var membersTemplate = template.Must(template.New("page").Parse(membersTemplateHTML))
  36. const membersTemplateHTML = `
  37. <html>
  38. <body>
  39. <table><tr><th>Key</th><th>Name</th><th>Email</th><th>Adress</th><th>Grade</th></tr>
  40. {{range .}}
  41. <tr>
  42. <td>{{.Key}}</td>
  43. <td>{{.FirstName}} {{.LastName}}</td>
  44. <td>{{.Email}}</td>
  45. <td>{{.Address}}</td>
  46. <td>{{.Grade}}</td>
  47. </tr>
  48. {{end}}
  49. </table>
  50. </body>
  51. </html>`
英文:

I am getting all the data successfully and displayed in a table using template. I am using Go in this code querying the datastore with Membership as entity type.

In the html page, all the data are displayed but not the keys.

I have tried to add Key *datastore.Key as property to the Membership struct but still no luck.

Here is my code:

  1. package hello
  2. import (
  3. &quot;appengine&quot;
  4. &quot;appengine/datastore&quot;
  5. &quot;html/template&quot;
  6. &quot;net/http&quot;
  7. &quot;time&quot;
  8. )
  9. type Membership struct {
  10. Key *datastore.Key
  11. Author string
  12. Content string
  13. FirstName string
  14. LastName string
  15. Address string
  16. Email string
  17. Grade string
  18. Date time.Time
  19. }
  20. func init() {
  21. http.HandleFunc(&quot;/&quot;, members)
  22. }
  23. func members(w http.ResponseWriter, r *http.Request) {
  24. c := appengine.NewContext(r)
  25. q := datastore.NewQuery(&quot;Membership&quot;).Order(&quot;-Date&quot;)
  26. memberships := make([]Membership, 0, 10)
  27. if _, err := q.GetAll(c, &amp;memberships); err != nil {
  28. http.Error(w, err.Error(), http.StatusInternalServerError)
  29. return
  30. }
  31. if err := membersTemplate.Execute(w, memberships); err != nil {
  32. http.Error(w, err.Error(), http.StatusInternalServerError)
  33. }
  34. }
  35. var membersTemplate = template.Must(template.New(&quot;page&quot;).Parse(membersTemplateHTML))
  36. const membersTemplateHTML = `
  37. &lt;html&gt;
  38. &lt;body&gt;
  39. &lt;table&gt;&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Email&lt;/th&gt;&lt;th&gt;Adress&lt;/th&gt;&lt;th&gt;Grade&lt;/th&gt;&lt;/tr&gt;
  40. {{range .}}
  41. &lt;tr&gt;
  42. &lt;td&gt;{{.Key}}&lt;/td&gt;
  43. &lt;td&gt;{{.FirstName}} {{.LastName}}&lt;/td&gt;
  44. &lt;td&gt;{{.Email}}&lt;/td&gt;
  45. &lt;td&gt;{{.Address}}&lt;/td&gt;
  46. &lt;td&gt;{{.Grade}}&lt;/td&gt;
  47. &lt;/tr&gt;
  48. {{end}}
  49. &lt;/table&gt;
  50. &lt;/body&gt;
  51. &lt;/html&gt;`

答案1

得分: 3

你需要将键分配给Key属性:

  1. func members(w http.ResponseWriter, r *http.Request) {
  2. ....
  3. if keys, err := q.GetAll(c, &memberships); err != nil {
  4. http.Error(w, err.Error(), http.StatusInternalServerError)
  5. return
  6. }
  7. // 遍历成员并添加键
  8. for i := range memberships {
  9. memberships[i].Key = keys[i]
  10. }
  11. ....
  12. }

你可能还想禁用在数据存储中存储Key属性:

  1. type Membership struct {
  2. Key *datastore.Key `datastore:"-"`
  3. ....
  4. }

顺便说一下,如果你想在HTML中显示*datastore.Key,你应该在显示之前对其进行Encode()处理。

英文:

You need to assign the key to the Key property:

  1. func members(w http.ResponseWriter, r *http.Request) {
  2. ....
  3. if keys, err := q.GetAll(c, &amp;memberships); err != nil {
  4. http.Error(w, err.Error(), http.StatusInternalServerError)
  5. return
  6. }
  7. // Loop over the membership and add the keys
  8. for i := range memberships {
  9. memberships[i].Key = keys[i]
  10. }
  11. ....
  12. }

You might also want to disable storing the Key property in the datastore:

  1. type Membership struct {
  2. Key *datastore.Key `datastore:&quot;-&quot;`
  3. ....
  4. }

Btw. if you want to display the *datastore.Key in HTML, you should Encode() it before.

huangapple
  • 本文由 发表于 2013年1月5日 04:44:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/14164678.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定