转到模板:无法评估类型Y中的字段X(X不是Y的一部分,但卡在{{range}}循环中)

时间:2017-04-06 18:38:18

标签: go go-templates

Similar question answered here,但我认为它不能解决我的问题。

我们假设你有以下结构:

type User struct {
    Username string
    Password []byte
    Email string
    ...
}

此外,网址结构如下:example.com/en/users,其中"en"是一个URL参数,将传递到模板中,如下所示:

renderer.HTML(w, http.StatusOK, "users/index", map[string]interface{}{
  "lang":  chi.URLParam(r, "lang"),
  "users": users})

在HTML模板中,我有以下内容:

{{ range .users }}
  <form action="/{{ .lang }}/users" method="POST">
    <input type="text" name="Username" value="{{ .Username }}">
    <input type="text" name="Email" value="{{ .Email }}">
  </form>
{{ end }}

现在问题是,因为{{ .lang }}不是User结构的一部分,所以我收到了错误..那么如何在{{ .lang }}内访问{{ range .users }}

2 个答案:

答案 0 :(得分:21)

调用.后,点($)的内容已分配给range,因此您可以使用$访问lang({{ 3}}):

{{ range .users }}
  <form action="/{{ $.lang }}/users" method="POST">
    <input type="text" name="Username" value="{{ .Username }}">
    <input type="text" name="Email" value="{{ .Email }}">
  </form>
{{ end }}

行为记录在案on play

  

执行开始时,$设置为传递给Execute的数据参数,即点的起始值。

如果使用嵌套范围,则始终可以使用with语句或变量赋值语句回退以将点分配给其他内容。请参阅here

答案 1 :(得分:7)

您可以将变量用于.lang

{{ $lang := .lang }}
{{ range .users }}
  <form action="/{{ $lang }}/users" method="POST">
    <input type="text" name="Username" value="{{ .Username }}">
    <input type="text" name="Email" value="{{ .Email }}">
  </form>
{{ end }}

请参阅文档:https://golang.org/pkg/text/template/#hdr-Variables