【问题标题】:How can I override a template block with an empty template?如何使用空模板覆盖模板块?
【发布时间】:2018-02-20 19:14:37
【问题描述】:

使用text/html 我在我的基本模板中定义了一个block,包含默认内容。在某些情况下,我希望这个块是空的,所以我想我可以重新定义它的名字,让它不包含类似的东西:

{{ block "something" . }}
    <h1>Default content</h1>
{{ end }}

// later in a place that does not want "something" ...
{{ define "something" }}{{ end }}

不知何故,Go 似乎认为这个定义是“零”并且仍然会呈现默认内容,除非我将任何非空白内容放入定义中。

我发现this issue on the Golang repoa Playground example 中很好地描述了同样的事情:

package main

import (
    "fmt"
    "os"
    "runtime"
    "text/template"
)

func main() {

    fmt.Printf("Version: %q\n", runtime.Version())

    t, err := template.New("master").Parse(`{{block "area51" .}}Original Content{{end}}`)
    if err != nil {
        panic(err)
    }
    t, err = t.New("other_template").Parse(`{{define "area51"}}{{end}}`)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Output:\n")
    if err := t.ExecuteTemplate(os.Stdout, "master", nil); err != nil {
        panic(err)
    }

    fmt.Printf("\n")

}

奇怪的是,问题提到它已修复(如果我理解正确,它会出现在 1.8.1 中),但它对我不起作用,无论是 1.8.1+ 还是 1.9。

这是 Golang 中的错误还是方法有缺陷?我是否需要做一些不同的事情来重新定义块以使其呈现为空?

【问题讨论】:

    标签: go go-templates


    【解决方案1】:

    这是预期的行为。这记录在Template.Parse()

    在第一次使用 Execute on t 或任何相关模板之前,可以在对 Parse 的连续调用中重新定义模板。 正文仅包含空格和 cmets 的模板定义被视为空,不会替换现有模板的正文。这允许使用 Parse 添加新的命名模板定义而不会覆盖主模板正文。 p>

    因此您不能“擦除”已定义的模板(您不能将其内容替换为空)。

    如果您“有条件地”需要它,则使用{{if}} 操作来决定是否调用模板。或者,您可以在模板中放置一个{{if}},模板本身可以选择不呈现任何内容。在这种情况下,您必须确保传递控制模板将呈现的内容的正确参数。

    附:如果您正在使用 HTML 模板,则应始终使用 html/template 而不是 text/template,因为前者提供与包 text/template 相同的接口,但也提供上下文转义以生成安全的 HTML 输出以防止代码注入。

    【讨论】:

    • 实际上,通过一个小小的 hack 是可能的 - 只需在此处输出 ""{{define "Footer"}}{{""}}{{end}}
    猜你喜欢
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多