2016-09-17 71 views
1

调用golang功能,我需要使用地图的几个键来创建JSON数据,需要纳入生成的html。我正在使用pongo2库,并希望编写自定义过滤器来实现相同。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

你的功能需要有签名'FUNC(在* pongo2.Value帕拉姆·pongo2.Value)(出* pongo2.Value ,err * pongo2.Error)' – jcbwlkr

+0

@ jcdwlkr-我读了文档,但我无法制作一个用例或实际工作代码。如果你可以给一个样本,它会有很大的帮助。 – virus

回答

3

的问题是,你的过滤函数不接受或返回的权利类型以匹配pongo2的需要。让我们浏览一下文档,看看他们想要什么。

首先来看看godoc为RegisterFilterFunction。它说

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) 

在围棋,你可以基于任何其他类型,包括功能,使自己的类型进一步下跌。那么,什么pongo2所做的就是创建一个名为类型,称为FilterFunction就是它接受两个参数(包括*pongo2.Value型)和返回两个值(*pongo2.value类型之一,*pongo2.Error类型之一)任何FUNC。

要整合所有我们会做这样的事情:

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! 
}