django學習——通過regroup方法對物件進行分組
regroup
用相似物件間共有的屬性重組列表。
比如有以下城市列表,我們想要按照國家名稱對其進行分類:
cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Chicago', 'population' : '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
得到類似如下的結果:
印度
孟買:19,000,000
加爾各答:15,000,000
美國
紐約:20,000,000
芝加哥:7,000,000
日本
東京:33,000,000
你可以使用{% regroup %}標籤來給每個國家的城市分組。 以下模板程式碼片段將實現這一點:
{% regroup cities by country as country_list %}
<ul>
{% for country in country_list %}
<li>{{ country.grouper }}
<ul>
{% for city in country.list %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
讓我們來看看這個例子。 {% regroup %}有三個引數: 你想要重組的列表, 被分組的屬性, 還有結果列表的名字. 在這裡,我們通過country_list屬性重新分組country列表,並呼叫結果cities。
{% regroup %}產生一個清單(在本例中為country_list的組物件。 組物件是具有兩個欄位的namedtuple()的例項:
- grouper - 按分組的專案(例如,字串“India”或“Japan”)。
- list - 此群組中所有專案的列表(例如,所有城市的列表,其中country =’India’)。
在Django更改1.11:
組物件已從字典更改為namedtuple()。
Because {% regroup %} produces namedtuple() objects, you can also write the previous example as:
{% regroup cities by country as country_list %}
<ul>
{% for country, local_cities in country_list %}
<li>{{ country }}
<ul>
{% for city in local_cities %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
這個問題的最簡單的解決方案是確保在你的檢視程式碼中,資料是根據你想要顯示的順序排序。
另一個解決方案是使用dictsort過濾器對模板中的資料進行排序,如果您的資料在字典列表中:
{% regroup cities|dictsort:"country" by country as country_list %}
分組其他屬性
一個有效的模版查詢是一個regroup標籤的合法的分組屬性。包括方法,屬性,字典健和列表項。 例如,如果“country”欄位是具有屬性“description”的類的外來鍵,則可以使用:
{% regroup cities by country.description as country_list %}
或者,如果choices是具有choices的欄位,則它將具有作為屬性的get_FOO_display()方法,顯示字串而不是country鍵:
{% regroup cities by get_country_display as country_list %}
{{ country.grouper }}現在會顯示choices。