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 | 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:
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:
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 |