[英]How do I create variables within a Pongo2 template?
TL;DR我需要一種從Pongo2模板中設置變量的方法,而不是將它們從我的 controller 代碼傳入,以便在全局模板 scope 中使用(即不在with
塊中)。
我剛剛開始學習 Go 並選擇Fiber作為我的框架,因為我的興趣在於 web。我必須選擇一個模板選項,因此決定使用他們的 Django ( Pongo2 ) 模板,因為它們看起來比 Go 的原生 HTML 產品更容易。 我個人發現兩者的文檔都嚴重缺乏,所以可能遺漏了一些東西。 因此,這個問題專門指通過光纖使用 Pongo2。
我找不到一種干凈/簡單的方法來在我的模板文件中設置一個變量(即不從控制器傳遞它們) ,以便它可以在我的模板中多次使用或安全地省略(作為后備)。
例如,如果我有一個模板文件blocks.html
,我可以為我的元素設置塊,然后精確地使用每個塊一次,即:
blocks.html
{% extends "base-blocks.html" %}
{% block title %}Page Title (not passed in){% endblock %}
{% block description %}My page description (not passed in){% endblock %}
base-blocks.html
<html>
<head>
<title>{% block title %}{% endblock %}</title>
<meta itemprop="name" content="!!want title here!!">
<meta name="description" content="{% block description %}{% endblock %}">
<meta itemprop="description" content="!!want description here!!">
</head>
<body>
<h1>!!want title here!!</h1>
<p>!!want description here!!</p>
</body>
</html>
如果我使用一個塊兩次(或者實際上如果我犯了任何錯誤,但那是另一個問題!), Fiber 只會毫無幫助地告訴我我的模板丟失了。
我知道我可以直接傳遞變量,例如:
variables.html
{% extends "base-variables.html" %}
<!-- Cannot set variables here!! -->
base-variables.html
<html>
<head>
<title>{{ title }}</title>
<meta itemprop="name" content="{{ title }}">
<meta name="description" content="{{ description }}">
<meta itemprop="description" content="{{ description }}">
</head>
<body>
<h1>{{ title }}</h1>
<p>{{ description }}</p>
</body>
</html>
這按預期工作,但對我而言,模板的目的是能夠完全控制文本並將前端和后端分開。
然后我在 Django 模板上搜索解決方案,並提供了 Pongo2 沒有實現的選項(即trans
),但也找到了一個可接受的選項: macros
。 所以我創建了它們,它們在 Fiber 之外工作:
macros.html
{% extends "base-macros.html" %}
{% block title %}Page Title (not passed in){% endblock %}
base-macros.html
{% macro title() export %}{% block title %}{{ DefaultTitle }}{% endblock %}{% endmacro %}
{% macro description() export %}{% block description %}{{ DefaultDescription }}{% endblock %}{% endmacro %}
<html>
<head>
<title>{{ title() }}</title>
<meta itemprop="name" content="{{ title() }}">
<meta name="description" content="{{ description() }}">
<meta itemprop="description" content="{{ description() }}">
</head>
<body>
<h1>{{ title() }}</h1>
<p>{{ description() }}</p>
</body>
</html>
這看起來是一個可以接受的解決方案(如果笨拙 - 必須為每個變量創建一個macro
),並且在原始 Go 中它滿足我的需求,例如:
test.go
package main
import (
"github.com/flosch/pongo2/v6"
"fmt"
)
func renderTitle(name string) {
fmt.Println()
fmt.Println("----------------------")
fmt.Println(name)
fmt.Println("----------------------")
}
func renderTemplate(name string, context pongo2.Context) {
template, err := pongo2.FromFile(name)
if err != nil {
panic(err.Error())
}
content, err := template.Execute(context)
if err != nil {
panic(err.Error())
}
fmt.Print(content)
}
func main() {
renderTitle("Blocks - ISSUE: Can only be used once")
renderTemplate("blocks.html", pongo2.Context{})
renderTitle("Variables - ISSUE: Require passing in from the Go code")
renderTemplate("variables.html", pongo2.Context{"title": "I don't want to pass variables from here!", "description": "I want to set these in the template itself..."})
renderTitle("Macros - ISSUE: Fails in Fiber framework if allowed to use default, Require manual macro creation for each case")
renderTemplate("macros.html", pongo2.Context{"DefaultTitle": "Fallback Title", "DefaultDescription": "Fallback description"})
}
“原樣”這些在 Fiber 中失敗,因為我省略了在我的模板中定義一個塊(在我的示例中的描述) (以觸發回退) 。 這是行不通的。 相反,它只是告訴我我的模板丟失了!! (即我犯了一個錯誤)
經過調查,我看到 Fiber 使用的是舊的 Pongo2 版本 (v4)。 所以我手動復制了 Pongo2 的 Fiber 引擎初始化代碼 ( this ) 並創建了我自己的使用 Pongo2 v6 的版本。 這讓我收到錯誤(最后) :
[Error (where: execution) in layouts/base-macros.html | Line 12 Col 39 near 'description']
[Error (where: execution) in layouts/base-macros.html | Line 1 Col 4 near 'macro'] internal error: len(block_wrappers) == 0 in tagBlockNode.Execute()
但是沒有嘗試調試一個成熟的 Go 項目(我才剛剛開始學習 Go) ,我不確定我應該做什么? 肯定有一種方法可以從模板中設置 Pongo2 中的變量嗎?
如果有人可以提供幫助,我將不勝感激。 提前致謝。
您可以使用設置標簽,例如:
{% 設置 a=5 %}
a 的值為 {{ a }}
output:a的值為5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.