处理程序中的变量未传递给模板

时间:2018-08-24 16:17:57

标签: go gin

here学习围棋和杜松子酒。 所以我有这样的路由器

userRoutes.POST("/login", ensureNotLoggedIn(), performLogin)

处理程序函数就是这样

func performLogin(c *gin.Context) {
  username := c.PostForm("username")
  password := c.PostForm("password")
  if isUserValid(username, password) {
    token := generateSessionToken()
    c.SetCookie("token", token, 3600, "", "", false, true)
    //is_logged_in is not working in template
    c.Set("is_logged_in", true)
    render(c, gin.H{"title": "Successful Login"}, "login-successful.html")
  } else {
    c.HTML(http.StatusBadRequest, "login.html", gin.H{
        "ErrorTitle":   "Login Failed",
        "ErrorMessage": "Invalid credentials provided",
    })
  }
}

我的模板就像

{{ if .is_logged_in }}
      <li><a href="/article/create">Create Article</a></li>
{{ end }}
{{ if not .is_logged_in }}
    <li><a href="/u/register">Register</a></li>
{{end}}

但是最后,模板中的此变量似乎不起作用,仅第二部分显示,第一个链接“ Create Article”始终隐藏。

更新

我将处理函数更改为类似的内容

        render(c, gin.H{"title": "Successful Login", "is_logged_in": c.MustGet("is_logged_in").(bool)}, "login-successful.html")

明确传递变量。现在,模板元素的隐藏和显示是正确的。那么Golang或Gin中有什么变化可以使.Set()的行为有所不同?

1 个答案:

答案 0 :(得分:0)

您是否首先加载模板?

func main() {
router := gin.Default()
router.LoadHTMLGlob("templates/*")
//router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")
router.GET("/index", func(c *gin.Context) {
    c.HTML(http.StatusOK, "index.tmpl", gin.H{
        "title": "Main website",
    })
})
router.Run(":8080")

} templates / index.tmpl

<html>
<h1>
    {{ .title }}
</h1>