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

问题描述 投票:12回答:2

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

假设你有以下结构:

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

此外,URL具有如下结构: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 }}

go go-templates
2个回答
21
投票

在调用.之后,dot($)的内容被分配给range,所以你可以使用$来访问langon play):

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

行为记录here

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

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


8
投票

您可以将变量用于.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

© www.soinside.com 2019 - 2024. All rights reserved.