首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从pongo模板调用Go函数

如何从pongo模板调用Go函数
EN

Stack Overflow用户
提问于 2016-09-17 20:30:06
回答 1查看 1.5K关注 0票数 1

我需要创建JSON数据使用地图的几个关键字,并需要合并到html生成。我正在使用pongo2库,并想编写自定义过滤器来实现同样的效果。

代码语言:javascript
复制
<script> {{ CategoryMapping|MycustomFilter }} </script>

和编码的自定义过滤器,如下所示。

代码语言:javascript
复制
func init() {

    pongo2.RegisterFilter("superfilter", GetCategoryJsonData)


}

func GetCategoryJsonData(CatAttributeMapping *map[string]interface{}, param *int) (*string, *error) {
.....
}

但是我的误差越来越小了。

代码语言:javascript
复制
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

我是新来的,不能理解我在这里做错了什么。请指导我做同样的事情。

EN

回答 1

Stack Overflow用户

发布于 2016-09-18 11:32:35

问题是您的过滤器函数不能接受或返回正确的类型来匹配pongo2所需的类型。让我们浏览一下文档,看看他们想要什么。

首先,看一下RegisterFilterFunction的godoc。上面写着

代码语言:javascript
复制
func RegisterFilter(name string, fn FilterFunction)

这是在pongo2包中,所以您应该理解为RegisterFilter是一个接受两个参数且不返回值的函数。第一个参数name的内置类型为string,第二个参数fn的类型为pongo2.FilterFunction。但是什么是pongo2.FilterFunction呢?单击它,我们可以在文档中看到更下面的内容

代码语言:javascript
复制
type FilterFunction func(in *Value, param *Value) (out *Value, err *Error)

在Go中,你可以根据包括函数在内的任何其他类型创建你自己的类型。因此,pongo2所做的就是创建一个名为FilterFunction的命名类型,它是任何接受两个参数(都是*pongo2.Value类型)并返回两个值(一个是*pongo2.value类型,另一个是*pongo2.Error类型)的函数。

为了把所有这些结合在一起,我们可以这样做:

代码语言:javascript
复制
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!
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39546834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档