Golang 模板中怎么能动态生成字段的列。

<table class="table table-striped">
<thead>
    <tr>
        {{range $k,$v := .Thead}}
            <th>{{$v}}</th>
        {{end}}
    </tr>
</thead>
<tbody>
    {{$tdValue := .Tbody}}
    {{range .Categories}}
    <tr>
        {{range $k,$v:= $tdValue}}
            <td>{{$v}}</td>
        {{end}}
    <!-- 
        <td>{{.Id}}</td>
        <td>{{.Title}}</td>
        <td>{{.TopicCount}}</td> -->
        <td>
            <a href="/category?op=del&id={{.Id}}">删除</a>
        </td>`
    </tr>
    {{end}}
</tbody>
</table>

目标是动态生成tbody中的td列,像注释中的值一样。

 thead := []string{"#", "名称", "文章数", "操作"}
fmt.Println(thead)
this.Data["Thead"] = []string{"#", "名称", "文章数", "操作"}
this.Data["Tbody"] = []string{".Id", ".Title", ".TopicCount"}
this.Data["Categories"], err = moduls.GetAllCategories()

共 12 个回复


lovederh

求大神指导啊!

# 0

jimmykuu

先把格式排好了,起码的诚意。

# 1

lovederh

markdown 不怎么会用 不好意思 。

# 2

jimmykuu

应该实现不了,struct 不支持,如果是 map,可以实现,去看 text/templateindex 方法的说明。

# 4

lovederh

好的,谢谢!

# 5

sneermorn

是的 可以用map 实在比较特殊实现不了就写个模板函数来转换

# 6

lovederh


想要的效果是这个样子的
数据结构如下:

web界面的代码如下:

实际得到的效果如下:

不知道要如何来实现这个效果,可以使td是动态生成的。
初学golang,还不是太熟练。求大神细心指点!

# 7

jimmykuu

还是用 index,不知道你看了文档没有?

this.Data["Tbody"] = []string{"Id", "Name", "Age"}

{{range _, $person := .Person}}
    <tr>
        {{range .Tbody}}
            <td>{{index $person .}}</td>
        {{end}}
    </tr>
{{end}}
# 8

lovederh

用map是可以的,但是感觉怪怪的,从数据库查出来的数据还要转为map,或者直接查map,struct就这样被弃用了,总感觉有点不爽啊。
最后数据结构这样构造:

html模板代码:

# 9

jimmykuu

或者你写个方法,通过反射获取。

# 10

kzzhr

这个需求感觉确实挺怪。我觉得可以通过两次渲染得到。

第一次把字段列表渲染为一个模板,再按照这个来渲染数据。

渲染字段列表可以在程序中用局部变量处理,不会影响其他地方

# 11