LoginSignup
3
0

More than 3 years have passed since last update.

Djangoの組み込みタグforloop.counterに悩まされた話

Last updated at Posted at 2020-05-30

Djangoの組み込みタグとは

正式名はDjangoの組み込みテンプレートタグです.
簡単に説明すると,
HTML内でfor文やif文を使ったり,(get_context_data等で格納した)django側の変数をHTMLに入れるときに使います.
for文と言っても

for i in range(1, 100):
  中身

みたいなことはできません.(自作とかしない限りは)
組み込みタグは自作することもできます.
詳しい説明はDjangoドキュメントの組み込みタグに任せます.
というか,今回悩まされたやつもこのページを見れば一発で解決します(笑)

環境

python 3.8.2
Django 3.0.6

問題

for文を駆使して,5回ごとに

タグで区切りたい
問題のコード
{% for obj in object_list %}
  {% if forloop.counter0|divisibleby:"5" or forloop.first %}
  <div class="row">
  {% endif %}
    {{ obj }}
  {% if forloop.counter1|divisibleby:"5" or forloop.last %}
  </div>
  {% endif %}
{% endfor %}

これだと5回ごとに</div>がされませんでした.
Djangoに精通している方ならもうお気づきだと思いますが,forloop.counter1なんてものはないんですね

解決

forloop.counter0でfor文の回数を0をスタートにカウントし,forloop.counterだと1からカウントします.
1がいらなかっただけでした.

{% for obj in object_list %}
  {% if forloop.counter0|divisibleby:"5" or forloop.first %}
  <div class="row">
  {% endif %}
    {{ obj }}
  {% if forloop.counter|divisibleby:"5" or forloop.last %}
  </div>
  {% endif %}
{% endfor %}

普段,CやJavaを使っているとデフォルト?が1からスタートなのは違和感があって思い込みで書いていました.
ちなみに,or以降がないと下記のエラーがでます.
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
これにかなりの時間悩まされたのはお恥ずかしい限りです

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0