2.1.0 use variable in dict



1. 在dict中使用变量

\{% set var = "var" %\}

# 在使用变量为dict的key时,不可以加上\{\{\}\}
dict[var]

2. 获取dict的key

\{% for key in dict.keys() %\}
\{\{ key \}\}
\{% endfor %\}

3. 获取dict的key和value

\{% for key,value in dict.items() %\}
\{\{ key \}\}
\{\{ value \}\}
\{% endfor %\}

4. 当key为variable时,它的作用域问题

错误的代码

\{% for sub_cat in TOPIC_DICT[cat].keys() %\}
  \{% for t in TOPIC_DICT[cat].get(sub_cat, []) %\}
  <li><a href="\{\{ t[1] \}\}">\{\{ t[0] \}\}</a></li>
  \{% endfor %\}
\{% endfor %\}
# 错误在于href中的t[1],当我们点击链接跳走的时候,url发生改变,作用域也改变了,而cat这个变量是存在于当前作用于的,于是乎会报错UndefinedError

正确的代码

\{% for sub_cat in TOPIC_DICT.get(cat, \{\}).keys() %\}
  \{% for t in TOPIC_DICT[cat].get(sub_cat, []) %\}
  <li><a href="\{\{ t[1] \}\}">\{\{ t[0] \}\}</a></li>
  \{% endfor %\}
\{% endfor %\}

详情请查看:github issues explain


5. 嵌套dict如何层层取值

# 嵌套dict
CAT_DICT = \{"linux":\{"linux":["basic", "advance", "commonly_services"]\},
            "python":\{"python":["basic", "advance"]\},
            "javaenv":\{"linux":["java_env"]\},
            "javascript":\{"javascript":["node.js"]\},
            "django":\{"django":["basic", "devops"]\},
\}

# uri_cat是一个已知的值
# 获取内嵌dict
\{% set cats_dict = CAT_DICT.get(uri_cat, \{\}) %\}
# 获取内嵌dict的第一个key
\{% set cat = cats_dict.keys()[0] %\}
# 获取内嵌dict的值
\{% set sub_cats = cats_dict[cat] %\}

PS

上面的\{\{\}\}是为了不和jinja2语法冲突,其实\只是转义符,实际使用时没有这个符号