Golang html/template versus Python Jinja2 (5) - Maps and Dictionaries


This post shows how to loop through the maps in Go html/template and dictionaries in Python Jinja2.

In Jinja2, loop.index or loop.index0 is used to access the loop index, starting from 1 or 0. (see [a])

In Go html/template, it seems that there is no way to access the loop index while loop through the variable of map type. (see [b])



Go html/template versue Python Jinja2 - Maps and Dictionaries
Go html/template Python Jinja2

template:

{{range $name, $href := .}}
<a href="{{$href}}">{{$name}}</a>
{{end}}

template:

{% for name, href in links.iteritems() %}
<a href="{{ href }}">{{ name }}</a>
{% endfor %}

loop index starting from 1:

{% for name, href in links.iteritems() %}
{{ loop.index }}: <a href="{{ href }}">{{ name }}</a>
{% endfor %}

loop index starting from 0:

{% for name, href in links.iteritems() %}
{{ loop.index0 }}: <a href="{{ href }}">{{ name }}</a>
{% endfor %}

template values:

var m = map[string]string{
    "Google": "https://www.google.com/",
    "Facebook": "https://www.facebook.com/",
}

template values:

links = {
  'Google': 'https://www.google.com',
  'Facebook': 'https://www.facebook.com',
}

Complete Go html/template source code:

html-template-example-4.go | repository | view raw
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
	"html/template"
	"os"
)

const tmpl = `
{{range $name, $href := .}}
<a href="{{$href}}">{{$name}}</a>
{{end}}
`

func main() {
	// map
	var m = map[string]string{
	    "Google": "https://www.google.com/",
	    "Facebook": "https://www.facebook.com/",
	}
	t, _ := template.New("foo").Parse(tmpl)
	t.Execute(os.Stdout, m)
}

Complete Python Jinja2 source code:

jinja2-example-4.py | repository | view raw
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from jinja2 import Template
import sys

tmpl = """
{% for name, href in links.iteritems() %}
<a href="{{ href }}">{{ name }}</a>
{% endfor %}

{% for name, href in links.iteritems() %}
{{ loop.index }}: <a href="{{ href }}">{{ name }}</a>
{% endfor %}

{% for name, href in links.iteritems() %}
{{ loop.index0 }}: <a href="{{ href }}">{{ name }}</a>
{% endfor %}
"""

if __name__ == '__main__':
  links = {
    'Google': 'https://www.google.com',
    'Facebook': 'https://www.facebook.com',
  }
  t = Template(tmpl)
  sys.stdout.write(t.render(links=links))

Tested on: Ubuntu Linux 14.10, Go 1.4, Python 2.7.8, Jinja2 2.7.3


Golang html/template versus Python Jinja2 series:

[1]Golang html/template versus Python Jinja2 (1)
[2]Golang html/template versus Python Jinja2 (2)
[3]Golang html/template versus Python Jinja2 (3) - Arrays and Slices
[4]Golang html/template versus Python Jinja2 (4) - Arrays and Slices Index
[5]Golang html/template versus Python Jinja2 (5) - Maps and Dictionaries
[6]Golang html/template versus Python Jinja2 (6) - Template Inheritance (Extends)
[7]Golang html/template versus Python Jinja2 (7) - Custom Functions and Filters

References:

[a]For - List of Control Structures - Jinja2 Documentation
[b]variables - template - The Go Programming Language