Передать строку в шаблон в голанге

Я рыскал в Интернете и не нашел вообще ничего о публикации в шаблоне html и форме в golang. Это моя попытка

моя ошибка не может использовать "html / template" .HTML ("login") (введите "html / template" .HTML) в качестве строки типа в аргументе для "html / template". New ("foo" ) .Parse

я хочу передать значение {{.ErrorMessage}} в html файле

Мой 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>[email protected]</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
}

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

}

person rince chacko    schedule 20.01.2016    source источник
comment
получил ответ. err: = GetTemplate (логин) .Execute (ответ, viewModel)   -  person rince chacko    schedule 20.01.2016


Ответы (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, )

Вам даже не нужна строка, в которой есть ошибка ... просто удалите эти 2 строки:

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

И, похоже, вы хотите передать viewModel в качестве параметра в шаблон, поэтому сделайте это в следующей строке и удалите последнюю запятую ,, чтобы он скомпилировался:

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

Небольшой совет: не анализируйте шаблоны в ваших обработчиках, это очень неэффективно, вместо этого анализируйте их при запуске приложения и просто повторно используйте проанализированные шаблоны. Прочтите этот вопрос для получения дополнительных объяснений:

Требуется слишком много времени при использовании пакета шаблонов для создания динамической веб-страницы для клиента в golang

person icza    schedule 20.01.2016