使用Jinja2构建链接列表

时间:2012-10-09 06:37:12

标签: python jinja2

我已经将一个字符串列表传递给了我的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 %}

如何在项目加入之前将项目转换为链接?

任何帮助都会很棒。

3 个答案:

答案 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 }}

工作正常。