2012-10-09 60 views
3

我已經將一串字符串傳遞給我的Jinja2模板。我想使用Jinja2到join的列表,但我想也將每個列表項目轉換爲href。是否可能或者我需要以某種方式將鏈接傳遞給模板?建立使用Jinja2的鏈接列表

# 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

所以我不相信這是可能單獨使用Jinja2的。我最終修復它的方法是在將它傳遞給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 }} 

工作正常。

1

我想用這個列表tuple。將它們傳遞到模板,如:

{ 
    'my_list': [ 
     ('a', 'a_href',), 
     ('b', 'b_href',), 
    ] 
} 

而且從您的模板,你應該僅僅是能夠做到這一點:

{% for name, href in my_list %} 
    <a href="{{href}}">{{name}}</a> 
{% endfor %} 
+0

謝謝,但這不是問題。問題是在鏈接列表中執行Jinja2'join「。 – MFB

+1

@MFB:有時候最好的答案並不是你目前的路徑。而且要清楚的是,Jinja2中的「join」並不是你想要解決的問題。顯示鏈接列表*是*。 –

+0

我試圖「加入」一個鏈接列表。那就是問題所在。不僅僅是創建一個鏈接列表。還是要謝謝你的幫助。 – MFB

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()系統,或者甚至僅僅使用來自控制器的元組。

+0

這顯然是正確的答案 - 當我在腳本中創建多行語句時,它幫助我將'\'附加到除最後一行之外的所有行的末尾 –