防止在Go的html/template中重写具有相同名称的块

huangapple go评论71阅读模式
英文:

Prevent overwriting of blocks with same name in Go html/template

问题

我在使用Go中的模板时遇到了一些困难。

我有一个基础模板(base.tmpl)和两个子模板(a.tmplb.tmpl)。

// base.tmpl
{{ define "base" }}
  {{ template "header" . }}
  {{ template "content" . }}
  {{ template "footer" . }}
{{ end }}
// a.tmpl
{{ template "base" . }}
{{ define "content" }}
  This is a.tmpl
{{ end }}
// b.tmpl
{{ template "base" . }}
{{ define "content" }}
  This is b.tmpl
{{ end }}

当执行a.tmpl时,b.tmpl中的内容块被插入。

例如,渲染a.tmpl会显示以下页面:

This is b.tmpl

我正在解析模板(见下文),并将结果返回并分配给变量x,以便我可以调用x.ExecuteTemplate(w, "a.tmpl", nil)

func parseTemplates() *template.Template {
	templ := template.New("")
	err := filepath.Walk("./templates", func(path string, info os.FileInfo, err error) error {
		if strings.Contains(path, ".tmpl") {
			_, err = templ.ParseFiles(path)
			if err != nil {
				log.Println(err)
			}
		}

		return err
	})

	if err != nil {
		panic(err)
	}

	return templ
}

我认为这是因为在解析模板时,Go将b.tmpl的内容块定义保留为最新的。

我想知道是否有一种方法可以在运行时解析所有模板,并且每次执行页面时无需重新解析头部、内容、页脚等,只需调用要执行的模板即可。

英文:

I'm having difficulty in rendering the correct content using templates in Go.

I have a base template (base.tmpl) and 2 child templates (a.tmpl and b.tmpl).

// base.tmpl
{{ define "base" }}
  {{ template "header" . }}
  {{ template "content" . }}
  {{ template "footer" . }}
{{ end }}
// a.tmpl
{{ template "base" . }}
{{ define "content" }}
  This is a.tmpl
{{ end }}
// b.tmpl
{{ template "base" . }}
{{ define "content" }}
  This is b.tmpl
{{ end }}

When executing a.tmpl the contents of the content block in b.tmpl are inserted.

For example, rendering a.tmpl results in a page displaying:

This is b.tmpl

I am parsing the templates (see below) and returning and assigning the result to a variable x so I may call x.ExecuteTemplate(w, "a.tmpl", nil)

func parseTemplates() *template.Template {
	templ := template.New("")
	err := filepath.Walk("./templates", func(path string, info os.FileInfo, err error) error {
		if strings.Contains(path, ".tmpl") {
			_, err = templ.ParseFiles(path)
			if err != nil {
				log.Println(err)
			}
		}

		return err
	})

	if err != nil {
		panic(err)
	}

	return templ
}

I am assuming this is because when parsing the templates, Go keeps b.tmpl's content block definition as the most recent.

I'm wondering if there's a way where I can parse all templates at run time and simply call the template I want to execute without having to re-parse the header, content, footer etc. each time I execute the page.

答案1

得分: 1

将模板分别解析为a和b。

atmpl, err := template.ParseFiles("base.tmpl", "a.tmpl")
if err != nil { /* 处理错误 */ }

btmpl, err := template.ParseFiles("base.tmpl", "b.tmpl")
if err != nil { /* 处理错误 */ }
英文:

Parse the templates for a and b separately.

atmpl, err := template.ParseFiles("base.tmpl", "a.tmpl")
if err != nil { /* handle error */ }

btmpl, err := template.ParseFiles("base.tmpl", "b.tmpl")
if err != nil { /* handle error */ }

huangapple
  • 本文由 发表于 2022年7月21日 02:32:00
  • 转载请务必保留本文链接:https://go.coder-hub.com/73056598.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定