3

我一直在网上搜索,找不到太多关于在 golang 中发布到 html 模板和表单的信息。这是我的尝试

我的错误 不能使用 "html/template".HTML("login") (类型 "html/template".HTML) 作为 "html/template".New("foo").Parse 参数中的类型字符串

我想将一个值传递给 html 文件中的 {{.ErrorMessage}}

我的 HTML (login.html)

{{ define "content"}}
<h2> {{.ErrorMessage}}</h2>


form action="/login" method="POST">
Username:input type="username" name="username">
Password:input type="password" name="password">
input type="submit" value="Submit">
/form>

{{end}}

{{define "extra_head"}} <title>Title</title>{{end}}
{{define "nav"}}{{end}}


{{define "extra_footer"}}<footer>copyright@xyz.com</footer>{{end}}
{{template "_layout.html" .}}

MAIN.G0

package main

import (

"net/http"
"ere.com/handlers"
)

func main() {
http.HandleFunc("/register", handlers.RegisterHandler) // setting router rule
http.HandleFunc("/sucess", handlers.RegisterSucessHandler)
http.HandleFunc("/login", handlers.LoginHandler)
http.HandleFunc("/update", handlers.UpdateHandler)
http.HandleFunc("/logout", handlers.LogoutHandler)
http.HandleFunc("/header", handlers.HeaderHandler)


if err := http.ListenAndServe(":8181", nil); err != nil {
    //log.Fatal("http.ListenAndServe: ", err)
}


}

处理程序 int

    package handlers
      import (
      "html/template"
       )

func GetTemplate(name string) *template.Template{
tmpl := template.Must(template.ParseFiles(
    "frontend/templates/_layout.html",
    "frontend/templates/" + name + ".html",
))


return tmpl
}

登录处理程序

    type viewModel    struct {
Id          bson.ObjectId
Email       string
Password    string
FirstName   string
LastName    string
ErrorMessage    string
}
    func LoginHandler (response http.ResponseWriter, request *http.Request) {
viewModel:=viewmodels.RegisterViewModel{}

if (request.Method == "POST") {

    request.ParseForm()
    user := models.User{}
    user.Email = request.Form.Get("username")
    user.Password = request.Form.Get("password")
    boolUser, userID := user.FindUserDB()

    if (boolUser != true) {

        viewModel.ErrorMessage = "incorrect username or password"

      //need help here

        t, err := template.New("foo").Parse(template.HTML("login"))
        err = t.ExecuteTemplate(response, "T", viewModel)


        err := GetTemplate("login").Execute(response, nil, )

        if err != nil {
            panic(err)
        }

    }else {

        setSession(userID, response)
        http.Redirect(response, request, "/update", 302)
    }


}else {
    err := GetTemplate("login").Execute(response, nil,)

    if err != nil {
        panic(err)
    }

}
4

1 回答 1

3

错误在这一行:

t, err := template.New("foo").Parse(template.HTML("login"))

template.Parse()方法需要一个类型的参数string,并且您将其传递一个类型的参数template.HTML

this:template.HTML("login")是一种类型转换,它将string值转换"login"为 type template.HTML。这不是必需的。只需使用:

t, err := template.New("foo").Parse("login")

虽然这不是您想要的,但您必须将模板文本传递给Parse()方法,而不是文件名!很可能你想打电话Template.ParseFiles()

事实上,因为这是以下内容(顺便说一句,这是一个语法错误):

err := GetTemplate("login").Execute(response, nil, )

您甚至不需要出现错误的行......所以只需删除以下两行:

t, err := template.New("foo").Parse(template.HTML("login"))
err = t.ExecuteTemplate(response, "T", viewModel)

看起来你想viewModel作为参数传递给模板,所以在下一行这样做并删除最后一个逗号,以使其编译:

err := GetTemplate("login").Execute(response, viewModel)

一个忠告:不要在你的处理程序中解析模板,效率非常低,而是在你的应用程序启动时解析它们,然后重用解析的模板。阅读这个问题以获得更多解释:

在golang中使用“模板”包生成动态网页给客户端需要太多时间

于 2016-01-20T08:54:30.597 回答