我一直在搜寻互联网,根本找不到关于在golang中发布到html模板和表单的任何信息。 这是我的尝试

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

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

我的HTML(login.html)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{{ define"content"}}
 {{.ErrorMessage}}


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{{end}}
{{define"nav"}}{{end}}


{{define"extra_footer"}}<footer>[email protected]</footer>{{end}}
{{template"_layout.html" .}}

主G0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    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
}

LoginHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    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)
    }

}
  • 得到了答案。 err:= GetTemplate(" login")。Execute(response,viewModel)

错误在这一行:

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

template.Parse()方法需要一个类型为string的参数,然后将其传递为类型为template.HTML的参数。

这:template.HTML("login")是类型转换,它将string"login"转换为类型template.HTML。不需要。只需使用:

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

尽管这几乎不是您想要的,但您必须将模板文本传递给Parse()方法,而不是文件名!您最有可能想致电Template.ParseFiles()

实际上,由于这是随后发生的(顺便说一句语法错误):

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

您甚至不需要有错误的行...因此只需删除以下两行:

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

并且看起来您想将viewModel作为参数传递给模板,因此在下一行执行此操作,并删除最后一个逗号,以使其编译:

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

一个建议:不要在处理程序中解析模板,这效率很低,而是在应用程序启动时解析它们,而只是重用解析后的模板。阅读此问题以获取更多说明:

使用"模板"包在golang中为客户端生成动态网页需要花费太多时间