rukurxの日記

自分の日々の作業や調べたことのメモ

Djangoのテンプレート内でリレーション関係の子データをソートする

リレーション組んで取得した子データの表示順がバラバラだったのでどうにかできないかと思ったらテンプレートの組み込みタグである dictsort を使って解決できました!

dictsortを指定したキーで昇順にする

<ul>
{% for user in users %}
  {% for hobby in user.hobbies.all|dictsort:"id"%}
      <li>{{ hobby.category.name }}: {{ hobby.name }}</li>
  {% endfor %}
{% endfor %}
</ul>

降順にしたい場合はdictsortreversedを指定する。てっきりorder_byみたいに-つければいいのかと思った...

<ul>
{% for user in users %}
  {% for hobby in user.hobbies.all|dictsortreversed:"id"%}
      <li>{{ hobby.category.name }}: {{ hobby.name }}</li>
  {% endfor %}
{% endfor %}
</ul>

更にリレーション関係のあるキーでソートしたい場合は、カンマ区切りで指定できる。

<ul>
{% for user in users %}
  {% for hobby in user.hobbies.all|dictsort:"category.id"%}
      <li>{{ hobby.category.name }}: {{ hobby.name }}</li>
  {% endfor %}
{% endfor %}
</ul>

参考

docs.djangoproject.com