2011-12-23 29 views
1

私はDjangoを使用して、iPhoneアプリケーション内で直接使用するplistとしてフォーマットされたテンプレートを生成しています。しかし、データベースに基づいてplistを正しく出力することができません。本質的に、私はテストを含むテーブルを持っています。それぞれtestIDとtest_typeを持っています。このテーブルでは、unique_together句を使用して、同じtestIDとtest_typeを持つエントリが2つありません。また、testIDとtest_typeで結果を並べ替えます。しかし私のテンプレートでは、同じ辞書内の同じtestIDを持つすべてのテストをグループ化したいと思います。 マイテンプレートは次のようになります。ディレクティブそれがなく、同じループ内で、最後に評価した時間に基づいて評価することdjangoテンプレートがplistテンプレート内で変更された場合

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>all_tests</key> 
    <array> 
     {% for t in tests %} 
     {% ifchanged t.testID %}<dict> 
      <key>testID</key> 
      <string>{{ t.testID }}</string> 
      <key>sections</key> 
      <array>{% endifchanged %} 
       <dict> 
        <key>pk</key> 
        <integer>{{ t.pk }}</integer> 
        <key>type</key> 
        <string>{{ t.test_type }}</string> 
        <key>num_questions</key> 
        <integer>{{ t.num_questions }}</integer> 
       </dict> 
      {% ifchanged t.testID %}</array> 
     </dict>{% endifchanged %}{% endfor %} 
    </array> 

を基本的に、私は{変わっ%があれば%}を望んでいました。もちろん、これは実際の動作ではありません。なぜなら、最後のループ反復に基づいて値を自然にチェックするからです。希望の出力をどのように作り出すべきですか? 「テスト」セットはテストIDによって順序付けされた場合に動作するはず

tests = Test.objects.annotate(num_questions=Count('questions')).filter(num_questions__gt=0).all() 

答えて

1

{%ifchanged%}また、テスト配列がを介して生成されます。

あなたが試してみました:

tests = Test.objects\ 
       .annotate(num_questions=Count('questions'))\ 
       .filter(num_questions__gt=0)\ 
       .order_by('testID').all() 

をあなたはまた{% regroup %}タグを見てみることができます。

[更新]

どうforloopのためのカップルのテストについて。{最初、最後}? (申し訳ありませんが、テストされていない...)

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>all_tests</key> 
    <array> 
     {% for t in tests %} 
     {% ifchanged t.testID %} 
      {% if not forloop.first %} 
      </array> 
      </dict> 
      {% endif %} 
      <dict> 
      <key>testID</key> 
      <string>{{ t.testID }}</string> 
      <key>sections</key> 
      <array>{% endifchanged %} 
       <dict> 
        <key>pk</key> 
        <integer>{{ t.pk }}</integer> 
        <key>type</key> 
        <string>{{ t.test_type }}</string> 
        <key>num_questions</key> 
        <integer>{{ t.num_questions }}</integer> 
       </dict> 
      {% if forloop.last %} 
      </array> 
      </dict> 
      {% endif %} 
    </array> 
+0

私の結果は既に自動的にテストID列によって順序付けされ、私は明示的に問題がある、私のコール – ecbtln

+0

で注文宣言する必要はありませんので、これは単なるモデルで宣言されています最初のループ内で最初にifchangedされたのと同じ条件は、最後にifchangedをトリガーします。実際には、最後のifchangedが、テストのサブセット内の最後のオブジェクトに対してのみ、commen testIDでトリガーするようにしたいときです。私のビューの方法で手動で達成する必要がありますか? – ecbtln

関連する問題