1. 程式人生 > >django學習——通過regroup方法對物件進行分組

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。