Golang模板无法加载

时间:2019-03-15 21:07:36

标签: go go-templates go-gin

我开始编写Gin应用程序,我的项目树看起来像

-assets
--css
---{bootstrap}
-templates
--layouts
---footer.html
---head.html
---header.html
--book.html
-main.go

在main.go中,我加载了模板,没有错误

router.LoadHTMLGlob("./templates/layouts/*.html")

我定义模板

{{ define "head" }}
<head>
    //Head
</head>
 {{ end }}

然后我将它们嵌套

 {{ define "header" }}
 {{ template "head.html" . }}
 //HTML
 {{ end }}

但是当我尝试使用它们时,输出为空

 {{ template "header" . }}
 <h1>{{ .Title}}</h1>

 <h3>{{ .Author.Fullname}}</h3>

[Edit]执行模板的功能:

func getBook(c *gin.Context) {
//DB stuff
var book models.Book
t, err := template.ParseFiles("templates/book.html")
if err != nil {
    log.Println(err)
}
t.Execute(c.Writer, book)
}

完整代码可在github上找到

2 个答案:

答案 0 :(得分:1)

public void onReceive(Context context, Intent intent) { super.onReceive(context,intent); if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) || intent.getAction().equals(Intent.ACTION_LOCKED_BOOT_COMPLETED)){ Intent mainActivityIntent = MainActivity.newIntent(context); // set flag on mainActivityIntent mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(mainActivityIntent);} } router.LoadHTMLGlob是两种处理模板的独立方法。 template.ParseFiles返回的模板不了解ParseFiles加载的模板。一旦决定使用LoadHTMLGlob,就应该使用c.HTML渲染模板。此c.HTML方法的LoadHTMLGlob自变量可以是name action 中指定的名称,也可以是该方法的基本名称模板文件(包括我认为的扩展范围)。

因此,在您的情况下,您可能应该执行以下操作:

{{define "name"}}

可以在此处找到更多示例:https://gin-gonic.com/docs/examples/html-rendering/

请记住,LoadHTMLGlob依赖于template.ParseGlob,其中指出:

  

以不同的名称解析具有相同名称的多个文件时   目录,最后提到的将是结果目录。

这意味着,如果您希望所有模板都可以通过c.HTML(http.StatusOK, "book.html", book) 访问,则需要确保它们具有唯一的基本名称,或者它们必须包含{{1 }}操作。

答案 1 :(得分:0)

从默认模板系统移到Gin有点混乱,默认模板系统使“一切都简单地工作”,这有点混乱,即使用文件作为模板时似乎存在一些命名限制。我不知道是否是这种情况,但是在我的设置中,我必须确保:

  • 模板的名称(define关键字)必须为 filename -至少是模板中唯一的define时(我尚未测试)包含多个defines)-例如,如果您使用./templates/book.html作为模板,则需要在该文件的顶部放置{{ define "book.html" }}(对于其他模板中包含的模板,这是正确的;我没有尝试过blocks或其他更深奥的方法来将jinx模板结合在一起)
  • 类似地,在调用c.HTML(http.StatusOK, "book.html", book)时,必须输入包含该模板的文件的全名(如图所示!)

换句话说,尽管手册中另有说明,@ mkopriva确认了手册中的内容,但我有不同的经验:只是我开始将文件名与define和{{1}进行匹配}称我停止获取空白页...

此外,从控制台(在调试模式下)运行时,很明显,我的程序正在“查找”远远超出应有的模板,即几乎每个模板都被复制了(一个文件名副本,另一个文件名副本)。 c.HTML()等)。这不仅使我困惑,而且使应用程序本身感到困惑。