DJangoテンプレートで関連アイテムのセットを並べ替えることは可能ですか?
つまり、このコード(わかりやすくするためにHTMLタグは省略されています):
{% for event in eventsCollection %}
{{ event.location }}
{% for attendee in event.attendee_set.all %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
私が欲しいとほぼ正確に表示します。変更したいのは、姓でソートする出席者のリストだけです。私はこのようなことを言ってみました:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_set.order_by__last_name %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
残念ながら、上記の構文は機能せず(空のリストが生成されます)、私が考えた他のバリエーションも機能しません(多くの構文エラーが報告されていますが、喜びはありません)。
もちろん、私の見解では、ソートされた出席者リストのある種の配列を作成することもできますが、それは醜くて壊れやすい(そして醜いことに言及しました)解決策です。
言うまでもありませんが、とにかく言いますが、私はオンラインドキュメントを熟読し、Stack Overflowとdjango-userのアーカイブを検索しましたが、何も役に立ちませんでした(ああ、クエリセットだけが辞書である場合はdictsortが実行します仕事ですが、そうではなく、そうではありません)
==============================================
Tawmasの回答を受け入れた後、追加の考えを追加するために編集されました。
Tawmasは、私が提示したとおりに問題に対処しましたが、解決策は私が期待したものではありませんでした。その結果、他の状況でも使用できる便利なテクニックを学びました。
トムの答えは、私がすでにOPで言及したアプローチを提案し、「醜い」として暫定的に拒否しました。
「醜い」は腸の反応だったので、何が悪いのかを明らかにしたかった。そうすることで、それが醜いアプローチである理由は、レンダリングするテンプレートにクエリセットを渡すというアイデアに夢中になっているためだと気づきました。その要件を緩和すると、うまくいくはずの醜いアプローチがあります。
私はまだこれを試してみましたが、むしろ、クエリセットを渡すよりも、ビューのコードは、イベントのリストを生成するクエリセットを繰り返しているとし、それに対応する参加者のためのクエリセットで各イベントを飾っていないWAS、(ソートまたはフィルタまたは何でも)望ましい方法で。そのようなもの:
eventCollection = []
events = Event.object.[filtered and sorted to taste]
for event in events:
event.attendee_list = event.attendee_set.[filtered and sorted to taste]
eventCollection.append(event)
これで、テンプレートは次のようになります。
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_list %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
欠点は、ビューがすべてのイベントを一度に「実際化」する必要があることです。これは、多数のイベントがあった場合に問題になる可能性があります。もちろん、ページ付けを追加することもできますが、それはビューをかなり複雑にします。
利点は、「表示するデータを準備する」コードがそれが属するビューにあり、テンプレートが表示用にビューによって提供されるデータのフォーマットに集中できるようにすることです。これは正しく適切です。
ですから、私の計画では、大きなテーブルにはTawmasの手法を使用し、小さなテーブルには上記の手法を使用し、大小の定義は読者に任せます(笑)。