我们可以通过定义模板名称{{define "home"}}
,然后通过将其加载到其他(父)模板中{{template "home"}}
。
如何通过变量value加载模板{{template .TemplateName}}
。还是不可能?
不幸的是你不能。
该{{template}}
动作的语法:
{{template "name"}}
The template with the specified name is executed with nil data.
{{template "name" pipeline}}
The template with the specified name is executed with dot set
to the value of the pipeline.
要包含的模板的名称是一个 常量 字符串,它不是 管道 ,在执行过程中可能会根据参数而有所不同。
如果允许的语法为:
{{template pipeline}}
那么您可以使用类似的命令,{{template .TemplName}}
但是由于语法仅允许使用常量字符串,因此您不能这样做。
从Rob推论为什么不允许动态模板调用(来源):
我们希望模板语言可以进行静态分析,以便模板调用的上下文清晰,可检查且可锁定。如果调用点是完全动态的,则无法完成。类似地,如果一个模板可以属于多个集合,则其上下文可以在集合之间有所不同,从而需要同时分析所有集合。由于您可以根据需要轻松地解决这两个约束,而这是以丢失更高级别包中的静态检查为代价的,因此控制基本模板实现中的情况似乎是明智的。如果约束清楚,则较高级别的程序包(例如,假设的仅HTML的包装程序)可以更轻松地保证没有变通办法。
您可以做的是先执行要包含的模板,然后将结果插入要包含的模板中。您可以使用特殊类型,例如html.HTML
在HTML模板的情况下,在插入时不要逃脱内部模板的结果。
请参阅以下示例:
func main() {
t := template.Must(template.New("t").Parse(t))
template.Must(t.New("t1").Parse(t1))
params := struct {
Name string
Value interface{}
}{"t1", nil}
b := bytes.Buffer{}
t.ExecuteTemplate(&b, params.Name, nil)
params.Value = template.HTML(b.String())
t.Execute(os.Stdout, params)
}
const t = `<html><body>
Now I will include template with name: {{.Name}}
{{.Value}}
</body>/html>`
const t1 = `I'm template <b>t1</b>.`
输出:
<html><body>
Now I will include template with name: t1
I'm template <b>t1</b>.
</body>/html>
在Go Playground上尝试一下。
模板的结果t1
未转义插入。如果您忽略template.HTML
:
params.Value = b.String()
t1
将插入转义,像这样:
<html><body>
Now I will include template with name: t1
I'm template <b>t1</b>.
</body>/html>
您可以重组模板,使其不希望包含不同名称的模板。
示例:您可能想在其中具有如下page
模板的页面中创建页面:
<html><body>
Title, headers etc.
{{template .Page}}
Footers
</body></html>
您可以将其重组为以下形式:
header
模板:
<html><body>
Title, headers, etc.
footer
模板:
Footers
</body></html
而你的页面模板将包括header
与footer
这样的:
{{template "header" .}}
Page content comes here.
{{template "footer" .}}
{{if}}
操作和预定义名称如果您事先知道模板名称并且它不是详尽的列表,则可以使用{{if}}
模板操作包括所需的模板。例:
{{if eq .Name "page1"}}
{{template "page1" .}}
{{else if eq .Name "page2"}}
{{template "page2" .}}
...
{{end}}
这里的想法是,您可以手动修改外部模板的静态文本,并插入要包括的内部模板的名称。
这种方法的缺点是,在插入内部模板的名称之后,您必须重新解析该模板,因此,我不建议这样做。
我得到的错误"警告:mysql_field_name()期望参数1是资源,对象在...在第28行" 我对PHP相当陌生,但我试图完成的是读取超文本标记语言文件,并用记录的值替换自定义标记。标签结构是|FIELD-NAME-Recage#|例如,如果我的sql返回两个记录的"名称"字段,它将在超文本标记语言文件中查找以下两个标签|Name1|和|Name2|,并用返回的两个替换它价值观。说亚当和吉姆
问题内容: 查找在Django模板字典值的常规方法是, 。如果键是循环变量怎么办?即: 失败。如何解决? 问题答案: 编写自定义模板过滤器: (我.get这样使用,如果不存在该键,则不返回任何键。如果执行此操作,则将引发一个then。) 用法:
问题内容: 我有以下带有变量的类,和。是一个关键字。如果要在下面的init方法中使用它,编写它的正确方法是什么? 更多上下文:该类明确需要该变量,因为它是另一个开发人员用另一种语言编写的POST端点所需的json的一部分。因此,更改变量名称是不可能的。 JsonAware代码: GenericEncoder代码: 问题答案: 如注释中所述,它是一个Python关键字,因此您不能将其用作变量名或属性
问题内容: 查找在Django模板字典值的常规方法是, 。如果键是循环变量怎么办?即: 失败。如何解决? 问题答案: 编写自定义模板过滤器: 用法:
问题内容: 我想在Django模板的字典中使用变量作为键。我一辈子都无法弄清楚该怎么做。如果我有一个带有名称或ID字段的产品,以及带有该产品ID索引的评级词典,那么我想说: 在python中,这可以通过简单的方式完成 但是我无法使其在模板中工作。我尝试使用…没有骰子。有想法吗? 问题答案: 你需要预先准备数据,在这种情况下,你应该将两元组列表传递给模板:
问题内容: 在使用包处理结构字段时遇到了麻烦。特别是,还没有弄清楚如何设置字段值。 获取字段i的名称-这似乎起作用 作为a)接口{},b)int获取字段i的值-这似乎有效 设置字段i的值-尝试一次-紧急 恐慌 :使用未导出字段中获得的值,使用reflect.Value·SetInt 假设它不喜欢字段名称“ id”和“ name”,因此将其重命名为“ Id”和“ Name” a)这个假设正确吗? b