【问题标题】:template inhereting issues: one template overrides the other模板继承问题:一个模板覆盖另一个
【发布时间】:2020-10-22 18:39:08
【问题描述】:

我有两个 HTML 模板(login.html、signup.html),它们都继承了 (base.html) 文件,问题是这两个文件之一覆盖了另一个文件的标题和内容。这意味着当我转到 /login/ 时,我看到了登录内容,但是当我转到 /signup/ 时,我再次看到了登录内容!当我停止 (login.html) 扩展 base.html 时,/signup/ 会显示注册页面的内容。

我还是 Go 新手,正在构建一个待办事项应用程序,所以我在这里做错了什么?

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

到这里一切正常
现在,当我开始添加更多模板时:
注册.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, r *http.Request, _ httprouter.Params) {
    renderTemplate(w, r, "signup", nil)
}
// Logins
func loginHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    renderTemplate(w, r, "login", nil)


    return
    }
    
//===================================================
//===================================================
//===================================================
//===================================================
//===================================================

创建用户的数据库代码(不确定是否相关

//===================================================
//===================================================
//===================================================
//===================================================
 func createUserHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
        if r.FormValue("password1") != r.FormValue("password2") {
            http.Redirect(w, r, "/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, r, "/login/", http.StatusFound)
    }
    func loginUserHandler(w http.ResponseWriter, r *http.Request, _ 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, err.Error(), http.StatusInternalServerError)
    }
    return db
}

【问题讨论】:

  • 请将您的golang 代码发送给我们。您的控制器或您的 http 处理程序
  • 完成__________
  • 如果你把{{ template "base" . }}放在你定义了标题和主模板之后会发生什么? (docs: "模板定义必须出现在模板的顶层,就像 Go 程序中的全局变量一样。")
  • 我把它放在页面的最底部,得到了相同的结果(在 {{define "main"}} 的 {{end}} 之后)
  • @ZeyadShapan 在这种情况下,您可以做的是将基础拆分为页眉/页脚,删除对 main 的任何引用,而是在登录和注册的顶部/底部调用页眉/页脚跨度>

标签: javascript typescript templates go-templates


【解决方案1】:

你可以这样做:

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

【讨论】:

    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多