我一直在搜索互联网,并且在golang中发布到html模板和表单方面找不到多少。这是我的尝试
我的错误 不能使用" html / template" .HTML(" 登录")(键入" html / template" .HTML)作为" html / template的参数中的类型字符串 "。新("富&#34)。解析
我想在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)
}
}
handler 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
}
LoginHandler
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)
}
}
答案 0 :(得分:1)
错误在这一行:
t, err := template.New("foo").Parse(template.HTML("login"))
template.Parse()
方法需要一个类型为string
的参数,并为其传递一个template.HTML
类型的参数。
这:template.HTML("login")
是类型转换,它将string
值"login"
转换为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)
建议:不要解析处理程序中的模板,效率非常低,而是在应用程序启动时解析它们,只需重用解析后的模板即可。阅读此问题以获得更多解释: