2011-12-23 52 views
1

我正在使用Django生成一個格式爲plist的模板,以便在iPhone應用程序中直接使用。但是,我無法讓plist根據我的數據庫正確輸出。基本上,我有一個包含測試的表。每個都有一個testID和一個test_type。該表使用unique_together子句確保沒有兩個條目具有相同的testID和test_type,並且還通過testID和test_type對結果進行排序。但在我的模板中,我想用同一個字典中的相同testID對所有測試進行分組。 我的模板看起來是這樣的:如果在plist模板中更改了django模板

<?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> 

從本質上講,我希望{%如果換成%}指令來評估基礎上,它最後一次評估,不一樣的循環中。但是這當然不是實際的行爲,因爲它自然會根據最後一次循環迭代檢查其值。我應該如何產生我想要的輸出?另外,通過在生成測試數組:

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

回答

1

的{%ifchanged%}如果「測試」組由testID有序應該工作。

你試過:

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

您還可以看看{% regroup %}標籤。

[更新]

如何約上幾個試驗for循環。{第一,最後}? (對不起,未經測試...)

<?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

我的結果已經自動被testID列排序,這只是在模型中聲明,所以我不必在我的電話明確聲明排序 – ecbtln

+0

的問題是在第一個循環中觸發第一個ifchanged的條件也會觸發最後一個ifchanged。實際上我希望最後一個ifchanged只用測試子集中的最後一個對象觸發,並使用comTestID。我需要在我的視圖的方法中手動完成嗎? – ecbtln