gpt4 book ai didi

go - 将字符串传递给golang中的模板

转载 作者:IT王子 更新时间:2023-10-29 01:06:04 26 4
gpt4 key购买 nike

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

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

我想在 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)
}


}

处理程序整数

    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)
}

}

最佳答案

错误在这一行:

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

template.Parse()方法需要一个类型为 string 的参数,而您向它传递了一个类型为 template.HTML 的参数.

这个:template.HTML("login")是一个类型转换,它将string"login"转换为类型模板.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)

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

It takes too much time when using "template" package to generate a dynamic web page to client in golang

关于go - 将字符串传递给golang中的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com