2011-12-27 38 views
1

我有以下型號:如何篩選在Django模板的object_list中

class CompanyReport(models.Model): 
    company = models.CharField(max_length=300) 
    desc = models.TextField() 
    text = models.TextField() 
    date = models.DateTimeField() 
  • 有一組公司
  • 每家公司都有一個實體,稱爲report
  • 可以有多個reportsyear爲同一家公司

我想做什麼是製作一個multilevel dropdown菜單。

  1. 在第一級會有公司名稱。
  2. 當我們點擊一​​個名字時,會有一個公司提交報告的年份列表。
  3. 當我們點擊一​​個特定的年份時,會列出當年的所有報告。

當我在php工作時,我能夠使用3個不同的查詢來做到這一點。

  1. 第一個查詢中包含的公司的名字和他們提交了一份報告,對特定公司報告
  2. 第二查詢中包含數在一年
  3. 第三查詢中包含的年數全部報告按公司名稱按升序排序。

我剛剛跑了3個嵌套循環,其中公司數量爲1,另一個爲該公司的年數,最後一年爲公司的報告數量,然後我剛剛顯示下一個從名單報告。

我可以使用Manager.raw來做同樣的事情,但我無法遍歷模板中的對象,因爲只有這個操作可用{% for obejct in object_list %}。我需要兩樣東西

  1. 方式爲number based for loop
  2. 這個PHP $row = mysql_fetch_array($query);它只是從查詢中獲取列表中的下一個元組的等效。

預計輸出我想要顯示的輸出類型在我上傳的屏幕截圖中。

Dropdown List 任何形式的幫助深表謝意。

回答

4

我不確定您爲什麼需要基於循環的數字。正常的迭代器是在Python中執行循環的正確方法。

如果由於某種原因在循環過程中需要索引,您可以使用:{{forloop.counter}}用於單索引計數器或{{forloop.counter0}}用於零索引計數器。

你的語法將是這個樣子:

{% for company in company_list %} 
    {{ company.company }} 
    {% for company_year in company_year_list %} 
     {% if company.date == company_year.date %} #note: this is pseudocode. you need a better comparison 
      {{ company_year.date }} 
      {% for company_report in company_report_list %} 
       {% if company_report.company == company and company_report.year = company_year.date %} 
        {{ company_report.report }} 
       {% endif %} 
      {% endfor %} 
     {% endif %} 
    {% endfor %} 
{% endfor %} 
+0

**就澄清** 這些列表'company_list','company_year_list'和'company_report_list'將使用'raw'查詢,因爲這些是填充基本上按不同屬性分組? – Sachin

+0

您提供的解決方案有一點。這並不是最佳的,我們正在通過可能不存在於數據庫中的組合進行循環。如果我們可以基於循環計數,那麼我們可以得到每個公司每年的報告數量。並且使用所有報告的列表,我們可以通過它們循環,公司,年份和記錄數將通過早期列表 – Sachin

+0

Sachin知道,您不應該使用原始查詢。看看'額外':http://stackoverflow.com/questions/327807/django-equivalent-for-count-and-group-by – Jordan