2010-10-31 129 views
2

我正在爲我的第一個Django網站編寫模板。Django模板問題(訪問列表)

我將一個字典列表傳遞給變量中的模板。我還需要傳遞其他一些列表,它們包含布爾標誌。 (注:所有的列表具有相同的長度)

模板看起來是這樣的:

<html> 
    <head><title>First page</title></head><body> 
     {% for item in data_tables %} 
     <table> 
     <tbody> 
        <tr><td colspan="15"> 
        {% if level_one_flags[forloop.counter-1] %} 
        <tr><td>Premier League 
        {% endif %} 
        <tr><td>Junior league 
        <tr><td>Member count 
        {% if level_two_flags[forloop.counter-1] %} 
        <tr><td>Ashtano League 
        {% endif %} 
      </tbody> 
     </table> 
     {% endfor %} 
    </body> 
</html> 

我收到以下錯誤:

Template error

In template /mytemplate.html, error at line 7 Could not parse the remainder: '[forloop.counter-1]' from 'level_one_flags[forloop.counter-1]'

我不驚訝我得到這個錯誤,因爲我只是想看看是否會工作。到目前爲止,從文檔中,我還沒有發現如何通過索引(即通過枚舉以外)獲取列表中的項目。

有誰知道我可以通過模板中的索引訪問列表?

回答

2

您可以使用dot-operator爲數組建立索引,或者真的可以做任何事情。

Technically, when the template system encounters a dot, it tries the following lookups, in this order:

* Dictionary lookup 
* Attribute lookup 
* Method call 
* List-index lookup 

我不相信你可以對指數做數學。你必須傳入以其他方式構造的數組,以便不必進行這種減法。

+0

嗯,Django開發人員似乎覺得這很愚蠢,因爲循環迭代和序列索引有不同的基礎。我敢肯定,我的做法是錯誤的。儘管如此,至少,由於您的信息,我可以訪問該項目 - 只是索引是錯誤的。我將不得不從循環結構中找到正確的基於零的索引。 – skyeagle 2010-10-31 15:36:15

+1

存在'counter0'。看到這裏:http://docs.djangoproject。com/en/dev/ref/templates/builtins /#對於 – 2010-10-31 16:16:20

+0

感謝Nick。我會記得下次使用這個(counter0) - 我知道django開發者不會留下類似的東西:)。 – skyeagle 2010-10-31 21:52:01

0

也許更好的方法是使用forloop.last。當然,這需要你發送給特定level_one_flaglevel_two_flag出level_one_flags和level_two_flags陣列的模板,但我認爲這個解決方案保存視圖和模板之間更好的邏輯分離:

<html> 
    <head><title>First page</title></head><body> 
    {% for item in data_tables %} 
    <table> 
    <tbody> 
       <tr><td colspan="15"> 
       {% if forloop.last and level_one_flag %} 
       <tr><td>Premier League 
       {% endif %} 
       <tr><td>Junior league 
       <tr><td>Member count 
       {% if forloop.last and level_two_flag %} 
       <tr><td>Ashtano League 
       {% endif %} 
     </tbody> 
    </table> 
    {% endfor %} 
    </body> 
</html> 
6

訪問列表總之,你想要什麼Django不這樣做。

for loop在循環中有許多有用的屬性。

 
forloop.counter  The current iteration of the loop (1-indexed) 
forloop.counter0 The current iteration of the loop (0-indexed) 
forloop.revcounter The number of iterations from the end of the loop (1-indexed) 
forloop.revcounter0 The number of iterations from the end of the loop (0-indexed) 
forloop.first  True if this is the first time through the loop 
forloop.last  True if this is the last time through the loop 
forloop.parentloop For nested loops, this is the loop "above" the current one 

您可能可以使用forloop.counter0來獲取您想要的基於零的索引;不幸的是,Django模板語言不支持可變數組索引(您可以做{{ foo.5 }},但不能做{{ foo.{{bar}} }})。

我通常所做的就是嘗試在視圖中排列數據,以便在模板中呈現。作爲一個例子,你可以在你的視圖中創建一個由字典組成的數組,這樣你所要做的就是循環訪問數組,並從個別字典中準確提取你需要的內容。對於非常複雜的事情,我已經創建了一個DataRow對象,它可以正確格式化表中特定行的數據。