如何解决模板插入问题:一个模板优先于另一个
我有两个HTML模板(login.html,signup.html),它们都继承了(base.html)文件,问题是两个文件之一覆盖了另一个文件的标题和内容。这意味着当我转到/ login /时,我看到登录内容,但是当我转到/ signup /时,我又看到了登录内容!并且当我停止(login.html)扩展base.html时,/ signup /向我显示了注册页面的内容。
我仍然对Go还是陌生的,正在构建一个Todo应用程序,那么我在做什么错了?
base.html:
{{define "base"}}
<!DOCTYPE html>
...
<title>{{template "title"}}</title>
...
{{template "main" .}}
...
{{end}}
login.html:
{{template "base" .}}
{{define "title"}}Login{{end}}
{{define "main"}}
Login Now!
{{end}}
到这里一切都很好
现在,当我开始添加更多模板时:
signup.html
{{template "base" .}}
{{define "title"}}Sign Up{{end}}
{{define "main"}}
Login or miss who you love >:(
{{end}}
更新:我的Go代码
main.go(可用于路由和可重用功能):软件包主要
import (
"html/template"
"log"
"net/http"
"github.com/julienschmidt/httprouter"
)
var templates = template.Must(template.ParseFiles("tmpl/base.html","tmpl/index.html","tmpl/signup.html","tmpl/login.html"))
func renderTemplate(w http.ResponseWriter,r *http.Request,tmpl string,data interface{}) {
err := templates.ExecuteTemplate(w,tmpl+".html",data)
if err != nil {
http.NotFound(w,r)
return
}
}
func main() {
r := httprouter.New()
r.GET("/signup/",signupHandler)
r.POST("/createuser/",createuserHandler)
r.GET("/login/",loginHandler)
log.Fatal(http.ListenAndServe(":8080",r))
}
auth.go(包含用于身份验证的处理程序)
package main
import (
"net/http"
"github.com/julienschmidt/httprouter"
)
func signupHandler(w http.ResponseWriter,_ httprouter.Params) {
renderTemplate(w,r,"signup",nil)
}
// Logins
func loginHandler(w http.ResponseWriter,"login",nil)
return
}
//===================================================
//===================================================
//===================================================
//===================================================
//===================================================
//===================================================
//===================================================
//===================================================
//===================================================
func createuserHandler(w http.ResponseWriter,_ httprouter.Params) {
if r.FormValue("password1") != r.FormValue("password2") {
http.Redirect(w,"/signup/",http.StatusFound)
return
}
db := connectDB(w,"TodoWoo")
defer db.Close()
q := `INSERT INTO users(username,password) VALUES (?,?)`
if _,err := db.Exec(q,r.FormValue("username"),r.FormValue("password1")); err != nil {
http.Error(w,err.Error(),http.StatusInternalServerError)
return
}
http.Redirect(w,"/login/",http.StatusFound)
}
func loginUserHandler(w http.ResponseWriter,_ httprouter.Params) {
}
driver.go(正在连接数据库,不确定是否与此有关
package main
import (
"database/sql"
"fmt"
"net/http"
_ "github.com/go-sql-driver/MysqL"
)
// Don't forgot to defer db.Close()
func connectDB(w http.ResponseWriter,scm string) *sql.DB {
db,err := sql.Open("MysqL",fmt.Sprintf("root:My44200444sql@(127.0.0.1:3306)/%s?parseTime=true",scm))
if err != nil {
http.Error(w,http.StatusInternalServerError)
}
return db
}
解决方法
您可以这样做:
base.html
{{define "base_header"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ . }}</title>
</head>
<body>
{{end}}
{{define "base_footer"}}
</body>
</html>
{{end}}
login.html
{{ $page_title := "Login" }}
{{ $page_footer := "login footer text" }}
{{ template "base_header" $page_title }}
Login Now!
{{ template "base_footer" $page_footer }}
signup.html
{{ $page_title := "Sign Up" }}
{{ $page_footer := "signup footer text" }}
{{ template "base_header" $page_title }}
Login or miss who you love >:(
{{ template "base_footer" $page_footer }}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。