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>