2016-08-09 2 views
0

мне нужно создать пользовательскую таблицу в шаблоне Джанго, как показано ниже:создания пользовательских таблицы в шаблоне djnago с помощью forloop

<table> 
    <tr> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td> 
     </td> 
    </tr> 
</table> 

Я хочу то есть добавить новый тег тр через каждые 3 TD-теги. Я попытался применить логику, используя {{forloop.counter | divisibleby: 4}}. Я пробовал что-то вроде ниже, но не дал желаемых результатов.

{% for items in range(5) %} 
    {% if forloop.counter ==1 or forloop.counter|divisibleby:4 %}\ 
    <tr> 
    {% endif %} 
    <td>name</td> 

    {% if forloop.counter|divisibleby:4 %} 
     </tr> 
    {% endif %} 
    </tr> 
{% endfor %} 

, но это, очевидно, неправильное решение. Update: Это порождает что-то, как показано ниже: Output Где каждое изображение т.д тег

+0

вы можете добавить скриншот того, что в настоящее время выглядит как выход и сделать вручную макет того, что вы хотите, чтобы выглядеть.Это поможет мне понять, чего вы пытаетесь достичь. – nkhumphreys

+0

@nkhumphreys Я добавил изображение для вывода, которое я получаю. – Simer

+0

- это шаблонный тег шаблона? – nkhumphreys

ответ

1

Эта часть не вычисляемая верно для правильных чисел:

{% if forloop.counter ==1 or forloop.counter|divisibleby:4 %} 

Это собирается оценить, правда, когда счетчик равен 1, 4, 8, 12 и т. д. Не каждые 3 числа, но каждые четыре числа. Вместо этого используйте forloop.counter0, например, так:

{%, если forloop.counter0 | divisibleby: 3%}

forloop.counter0 начинается с 0, так что это будет делится на 3 в 0, 3, 6, 9, и так далее, как вы хотите.

Существует еще одна проблема с кодом здесь:

{% if forloop.counter|divisibleby:4 %} 
    </tr> 
{% endif %} 
</tr> 

Если вы хотите только тег должен быть закрыт после каждого третьего элемента, а затем удалить один снаружи, если условия. Также вы добавляете закрывающий тег в неправильные части. Он должен быть один элемент, прежде чем снова открыть тег, поэтому на 3-й элемент, 6 элемента и т.д. Для этого вы можете использовать forloop.counter как так:

{% if forloop.counter|divisibleby:3 %} 
    </tr> 
{% endif %} 

общий, ваш код должен выглядеть это:

{% for items in range(5) %} 
    {% if forloop.counter0|divisibleby:3 %} 
     <tr> 
    {% endif %} 
    <td>name</td> 
    {% if forloop.counter|divisibleby:3 %} 
     </tr> 
    {% endif %} 
{% endfor %} 
</tr> 

Если вы используете неизвестную nbr количество элементов вместо 5, просто заменить </tr> тег вне forloop для

{% if not nbr|divisibleby:3 %} 
    </tr> 
{% endif %} 

, так что у вас не будет двух </tr> с, если бы был добавлен последний цикл цикла for.

+0

@Simer Я добавил примечание в конце, если вы используете переменное количество элементов – dietbacon

+0

Что такое 'nbr' в вашем решении? – Simer

+1

@Simer Общее количество товаров. Поэтому, если вы используете '{% для элементов в диапазоне (nbr)%}', тогда используйте эту часть в конце, а не просто ''. или если вы используете '{% для элементов в my_queryset%}' вместо диапазона, просто замените 'nbr' на' my_queryset.count' – dietbacon

1

Так это потому, что вы вставляете <tr> И </tr> если счетчик forloop делится на 4. Вы также вставив <tr> если счетчик forloop равно 1. Таким образом, первая строка работы, вторая строка вставит открытия и закрытия теги (потому что счетчик forloop все еще делится на 4). Ваша логика отключена.

Я думаю, что вы хотите:

<table> {% for items in range(5) %} {% if forloop.counter == 1 %} <tr> {% endif %} <td>name</td> {% if forloop.counter|divisibleby:4 %} </tr><tr> {% endif %} {% endfor %} </tr> </table>

+0

Благодарим вас за решение @nkhumphreys. Я тоже попробую это сделать. На данный момент я выбрал решение dietbacon, поскольку он выглядит немного проще и оптимизирован. Спасибо за ваши старания. – Simer

+1

Решение Yeh dietbacon хорошее. Я не думаю, что это особенно важно, начинаете ли вы свой индекс в 1 или 0. Я пурист, поэтому предпочитаю начинать с 0, но я не хотел путать ответ. Важно, чтобы получить логику для того, где правильно вставить теги – nkhumphreys

+0

@nkhumphreys Это решение в порядке. Он отлично работает на 5 предметов, но он ломается, если у вас есть более 7 предметов, так как он начнет разделять позиции 4 на 4. – dietbacon

Смежные вопросы