我需要使用几个映射键创建JSON数据,并且需要合并到生成的html中。我正在使用pongo2库,并希望编写自定义过滤器来实现相同的目标。
<script> {{ CategoryMapping|MycustomFilter }} </script>
和编码自定义过滤器如下。
func init() {
pongo2.RegisterFilter("superfilter", GetCategoryJsonData)
}
func GetCategoryJsonData(CatAttributeMapping *map[string]interface{}, param *int) (*string, *error) {
.....
}
但我收到了以下错误。
src/util/TemplateFilters.go:10: cannot use GetCategoryJsonData (type func(*int, *int) (*string, *error)) as type pongo2.FilterFunction in argument to pongo2.RegisterFilter
我正在遵循以下文档 - https://godoc.org/github.com/flosch/pongo2#FilterFunction
我是新来的,无法理解我在这里做错了什么。请指导我。
答案 0 :(得分:3)
问题是你的过滤器功能不接受或返回正确的类型以匹配pongo2所需的类型。让我们一起浏览文档,看看他们想要什么。
首先,看一下RegisterFilterFunction
的godoc。它说
func RegisterFilter(name string, fn FilterFunction)
这是在pongo2
包中,因此您应该阅读此内容,因为RegisterFilter
是一个接受两个参数并且不返回任何值的函数。第一个参数name
属于内置类型string
,第二个参数fn
属于pongo2.FilterFunction
类型。但什么是pongo2.FilterFunction
?点击它,我们在doc
type FilterFunction func(in *Value, param *Value) (out *Value, err *Error)
在Go中,您可以根据包括功能在内的任何其他类型制作自己的类型。所以pongo2所做的就是创建一个名为FilterFunction
的命名类型,它是任何接受两个参数(都是类型*pongo2.Value
)的函数,并返回两个值(类型*pongo2.value
之一)和一个类型*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!
}