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 |