簡體   English   中英

如何在 Pongo2 模板中創建變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM