我已经将一个字符串列表传递给了我的Jinja2模板。我想将Jinja2用于join
列表,但我还希望将每个列表项转换为href
。是否有可能或者我是否需要以某种方式将链接传递给模板?
# I use this to join the list items.
{{ my_list|join(', ') }}
# I use this to make links individually
{% for i in my_list %}
<a href="/edit/{{ i }}">i</a>
{% endfor %}
如何在项目加入之前将项目转换为链接?
任何帮助都会很棒。
答案 0 :(得分:9)
使用loop
special variable of for
loops:
{% for i in my_list %}
<a href="/edit/{{ i }}">i</a>{% if not loop.last %}, {% endif %}
{% endfor %}
您也可以将其包装在宏中:
{% macro listlinks(mylist, urltemplate="/edit/%s", connective=", ") -%}
{% for item in mylist -%}
<a href="{{ urltemplate|format(item)|e }}">{{ item|e }}</a>
{% if not loop.last %}{{ connective|e }}{% endif %}
{%- endfor %}
{%- endmacro %}
{{ listlinks(list_of_ids) }}
但是,我建议你不要在你的模板中建立路径名,正如@Demian在他的回答中所说的那样。最好通过一些抽象机制在模板之外构建路径名,例如Pyramid的request.route_url()
系统,或者甚至只是控制器中的元组。
答案 1 :(得分:1)
我会为此使用tuple
列表。将它们传递到模板中,例如:
{
'my_list': [
('a', 'a_href',),
('b', 'b_href',),
]
}
从您的模板中,您应该能够做到这一点:
{% for name, href in my_list %}
<a href="{{href}}">{{name}}</a>
{% endfor %}
答案 2 :(得分:0)
所以我不相信单独使用Jinja2是可能的。我最终修复它的方法是在将Python传递给Jinja2之前在Python中构建逗号分隔的锚标记列表。然后我不得不告诉Jinja2 HTML是safe
。
从我的金字塔视图中返回:
result['list_string'] = ', '.join(['<a href="view/%s">i._name</a>' % i._id\
for i in objects])
return result
然后在模板中:
{{ list_string|safe }}
工作正常。