html模板中循环怎么做?

比如从数据库中取出一组数据books,现在怎样在html模板中循环出来呢?

共 30 个回复


jimmykuu

查看text/templaterange

{{range .books}}
    <h1>{{.Title}} <small>{{.Author}}</small></h1>
{{end}}
# 0

bianweiall

兄弟,刚刚做了下没成!

template: booklist.html:1: can't evaluate field books in type []main.Book

这个是什么意思啊?

# 2

jimmykuu

你Execute里是如何传递的参数?

# 3

bianweiall

func renderTemplate2(w http.ResponseWriter, tmpl string, bs []Book) {
    err := templates[tmpl].Execute(w, bs)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

func bookListHandler(w http.ResponseWriter, r *http.Request, id string) {
    idToInt, _ := strconv.Atoi(id)
    var b Book
    books, err := b.getListBook(10, idToInt*10-10)
    if err != nil {
        fmt.Fprintf(w, "获取数据出错!!!")
        return
    }
    renderTemplate2(w, "tmpl/booklist", books)
}

是err := templates[tmpl].Execute(w, bs)这句错了,怎么改?

# 4

jimmykuu

{{range .}}
    you code here
{{end}}
# 5

gaicitadie

如果是两层嵌套的循环怎么做呢?比如

{{range .users}}
   {{range .books}}
      {{.Name}}
   {{end}}
{{end}}

里面的.Name怎么判定是user的还是book的?

# 7

descusr

@gaicitadie 是book的。

# 8

qkevin123

把一个数组在HTML中循环显示正常。

那么map该如何做呢?我需要把map中的key和value都输出到HTML中。key和value都是动态生成的,我无法提前知道key是什么。

比如下面的定义,

  type HomePage struct {
     Pages map[string]string
  }

  {{range .Pages}}
      {{.Key}}
  {{end}}

确认map中是有内容的,not nil,无法获得结果。

在text/template中有这个说明,没有搞定,求援。

  • The name of a key of the data, which must be a map, preceded by a period, such as .Key The result is the map element value indexed by the key. Key invocations may be chained and combined with fields to any depth: .Field1.Key1.Field2.Key2 Although the key must be an alphanumeric identifier, unlike with field names they do not need to start with an upper case letter. Keys can also be evaluated on variables, including chaining: $x.key1.key2
# 9

jimmykuu

{{range $key, $value := .Pages}}
    {{$key}}, {{$value}}
{{end}}
# 10

qkevin123

great, many thanks.

# 11

122676434

{{range .books}}

{{.Title}} {{.Author}}

{{end}} 请问这个books 是怎么来的,另外如何便历list.List呢

# 12

jimmykuu

t.Execute(wr, map[string]interface{}{"books": books]}) ,构造一个 map 传入模板。

不知道你的 list.List 是啥意思。

# 13

122676434

就是"container/list" 包中的List 我里面放的结构体,请问题怎么遍历呢? 代码遍历是

for e := listObj.Front(); e != nil; e = e.Next() {
   if stu, ok := e.Value.(entity.StudentEnt); ok {
   }
}

不知道在模板中怎么用

# 14

jimmykuu

你可以代码里先处理成 slice 再到模板中用。

# 15

yue

借贵贴问一个问题:

revel 模板 {{range .errors}}{{.}}{{end}}

输出: err1 err2 err3

如果我只想要err1,怎么做呢?谢谢!

# 16

jimmykuu

{{index .errors 0}}
# 17

yue

谢谢,我基础真不牢呀,根据您这个找到答案了 executing "user/Signin.html" at : error calling index: int is not index type for map[string]*revel.ValidationError

=====

我这个是map error.name
error.password 这样就可以了

# 18

qingo

{{range .users}} {{range .books}} {{.Name}} {{end}} {{end}}

我也同问,怎么设计2层以上嵌套循环啊?

# 19

jimmykuu

这样就可以,只不过你的 User 的字段 Books 不能用小写开头,否则在模板在是不可见的,将会报错。

# 20

qingo

没想到这么快就回答,谢谢,反而我在外地开会,耽误了阅读,抱歉。因为是小白,所以见谅。 我的代码是这样:

  {{range .Categoryjieduan}}
  <tr>
    <th>{{.Id}}</th>
    <th>{{.Title}}</th>
    <th>{{.Views}}</th>
  </tr>
  {{end}}
             {{range .Categoryzhuanye}}
             <tr>
             <th>{{$v.Title}}</th>
             </tr>
             {{end}}

             {{range .Categorychengguo}}
             <tr>
              <th><a href="/topic/add?id={{.Id}}">{{.Title}}</a></th>
              <th><a href="/topic/add?id={{.Id}}">添加成果</a>
              <a href="/category/modify?tid={{.Id}}">修改</a>
              <a href="/category/delete?tid={{.Id}}">删除</a>
               </th>
             </tr>
             {{end}}

以上代码可以正确显示,而改成嵌套循环就不行了,如下,提示说models中没这个结构

  {{range .Categoryjieduan}}
  <tr>
    <th>{{.Id}}</th>
    <th>{{.Title}}</th>
    <th>{{.Views}}</th>
             {{range .Categoryzhuanye}}
               <th>{{.Title}}</th>
                 {{range .Categorychengguo}}
                   <th><a href="/topic/add?id={{.Id}}">{{.Title}}</a></th>
                 {{end}}
            {{end}}
  </tr> 

{{end}}

# 21

jimmykuu

我明白你的意思了,你这样写的话,模板会认为 CategorychengguoCategoryzhuanye 的字段,解决方法是加个 $ ,这样模板就知道去找顶层的变量了。

{{range .Categoryjieduan}}
<tr>
  <th>{{.Id}}</th>
  <th>{{.Title}}</th>
  <th>{{.Views}}</th>
    {{range $.Categoryzhuanye}}
       <th>{{.Title}}</th>
       {{range $.Categorychengguo}}
         <th><a href="/topic/add?id={{.Id}}">{{.Title}}</a></th>
       {{end}}
    {{end}}
  </tr> 
{{end}}
# 22

qingo

果然是这样。非常感谢jimmykuu。

# 23

qingo

再加入判断就成这样:

  {{range $k,$v :=.Categoryjieduan}}
  <tr>
    <th>{{.Id}}</th>
    <th>{{.Title}}</th>
    <th>{{.Views}}</th> 
             {{range $k1,$v1 :=$.Categoryzhuanye}}
             {{if eq $v.Id $v1.ParentId}}
                  ……
            {{end}}
# 24

lovederh

你好,请问一下,如果我想把

  {{range $k,$v :=.Categoryjieduan}}
  <tr>
    <th>{{.Id}}</th>
    <th>{{.Title}}</th>
    <th>{{.Views}}</th> 
             {{range $k1,$v1 :=$.Categoryzhuanye}}
             {{if eq $v.Id $v1.ParentId}}
                  ……
            {{end}}

这里面的

    <th>{{.Id}}</th>
    <th>{{.Title}}</th>
    <th>{{.Views}}</th>

部分做一个循环要怎么做。
类似这样

 {{range $k,$v :=.Categoryjieduan}}
  <tr>
{{range $k,$v:= .Thead}}
<th>{{$v}}</th>
{{end}}
{{end}}
# 25

kzzhr

还是先看一遍官方文档吧。。。

# 26

litengjiao11

我想问下html页面怎么把后台传来的一个list循环放到一个table里面
m.put(“list”, ls.querylol());
后台的方法是这样 然后前台怎么给他弄出来 用html

# 27

Along

支持好东西

# 29