web-dev-qa-db-fra.com

Modèle Go: impossible d'évaluer le champ X dans le type Y (X ne fait pas partie de Y mais est coincé dans une boucle {{range}})

Réponse à une question similaire ici , mais je ne pense pas que cela résout mon problème.

Disons que vous avez la structure suivante:

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

De plus, l'URL a une structure comme celle-ci: example.com/en/users, où "en" est un paramètre d'URL qui sera passé dans le modèle comme ceci:

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

Et dans le modèle HTML, j'ai les éléments suivants:

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

Maintenant, le problème est que parce que {{ .lang }} ne fait pas partie de la structure User alors j'obtiens l'erreur .. alors comment puis-je accéder à {{ .lang }} à l'intérieur {{ range .users }}?

13
fisker

Le contenu du point (.) sont affectés à $ après invocation de range, vous pouvez donc utiliser $ pour accéder à lang ( en lecture ):

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

Le comportement est documenté ici :

Lorsque l'exécution commence, $ est défini sur l'argument de données passé à Execute, c'est-à-dire à la valeur de départ de dot.

Si vous utilisez des plages imbriquées, vous pouvez toujours recourir à l'affectation d'un point à autre chose à l'aide de l'instruction with ou des instructions d'affectation de variable. Voir l'autre réponse pour cela.

22
nemo

Vous pouvez utiliser une variable pour .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 }}

Voir ici à la documentation: https://golang.org/pkg/text/template/#hdr-Variables

8
apxp