вопрос шаблона django (доступ к списку) - PullRequest
2 голосов
/ 31 октября 2010

Я пишу шаблон для моего первого веб-сайта 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>

Я получаю следующую ошибку:

Ошибка шаблона

В шаблоне /mytemplate.html ошибка в строке 7 Не удалось проанализировать остаток: '[forloop.counter-1]' из 'level_one_flags [forloop.counter-1]'

Я не удивлен, что получаю эту ошибку, так как я просто пытался понять, сработает ли это.До сих пор из документации я не выяснил, как получить элементы в списке по индексу (т. Е. Кроме перечисления).

Кто-нибудь знает, как я могу получить доступ к списку по индексу в шаблоне?

Ответы [ 4 ]

7 голосов
/ 31 октября 2010

Короче говоря, 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

Youвозможно, вы можете использовать forloop.counter0, чтобы получить нужные вам индексы с нулями;к сожалению, язык шаблонов Django не поддерживает индексы переменных массивов (вы можете делать {{ foo.5 }}, но вы не можете делать {{ foo.{{bar}} }}).

Обычно я пытаюсь расположить данные ввид, чтобы его было проще представить в шаблоне.Например, вы можете создать в своем представлении массив, состоящий из словарей, так что все, что вам нужно сделать, это перебрать массив и извлечь именно то, что вам нужно, из отдельных словарей.Для действительно сложных вещей я зашел так далеко, что создал объект DataRow, который бы правильно форматировал данные для определенной строки в таблице.

2 голосов
/ 31 октября 2010

Вы используете оператор точки для индексации массива или, действительно, для выполнения каких-либо действий.

Технически, когда система шаблонов встречает точку, она пытаетсяследующие поиски, в следующем порядке:

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

Я не верю, что вы можете сделать математику по индексу.Вам нужно будет передать свой массив, построенный каким-либо другим способом, чтобы вам не пришлось делать это вычитание.

1 голос
/ 31 октября 2010

Попробуйте использовать «слайс» для доступа к списку по индексу

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#slice

0 голосов
/ 31 октября 2010

Возможно, лучше использовать forloop.last. Конечно, для этого потребуется отправить в шаблон конкретные level_one_flag и level_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>
...