问题是您的过滤器函数不接受或返回正确的类型以匹配 pongo2 的要求。让我们浏览一下文档,看看他们想要什么。
首先,看一下RegisterFilterFunction
. 它说
func RegisterFilter(name string, fn FilterFunction)
这是在pongo2
包中,所以你应该把它当作RegisterFilter
一个接受两个参数并且不返回值的函数来阅读。第一个参数name
是内置类型string
,第二个参数fn
是类型pongo2.FilterFunction
。但什么是pongo2.FilterFunction
? 好吧,点击它,我们会在文档中进一步看到
type FilterFunction func(in *Value, param *Value) (out *Value, err *Error)
在 Go 中,您可以基于任何其他类型(包括函数)创建自己的类型。所以 pongo2 所做的是创建一个名为的命名类型FilterFunction
,它是任何 func,它接受两个参数(都是 type *pongo2.Value
)并返回两个值(一个 type*pongo2.value
和一个 type *pongo2.Error
)。
为了把它们结合在一起,我们会做这样的事情:
package main
import (
"fmt"
"log"
"strings"
"github.com/flosch/pongo2"
)
func init() {
pongo2.RegisterFilter("scream", Scream)
}
// Scream is a silly example of a filter function that upper cases strings
func Scream(in *pongo2.Value, param *pongo2.Value) (out *pongo2.Value, err *pongo2.Error) {
if !in.IsString() {
return nil, &pongo2.Error{
ErrorMsg: "only strings should be sent to the scream filter",
}
}
s := in.String()
s = strings.ToUpper(s)
return pongo2.AsValue(s), nil
}
func main() {
tpl, err := pongo2.FromString("Hello {{ name|scream }}!")
if err != nil {
log.Fatal(err)
}
// Now you can render the template with the given
// pongo2.Context how often you want to.
out, err := tpl.Execute(pongo2.Context{"name": "stack overflow"})
if err != nil {
log.Fatal(err)
}
fmt.Println(out) // Output: Hello STACK OVERFLOW!
}