如何在 django 模板中过滤 object_list
Posted
技术标签:
【中文标题】如何在 django 模板中过滤 object_list【英文标题】:how to filter an object_list in django template 【发布时间】:2012-01-28 16:58:06 【问题描述】:我有以下型号:
class CompanyReport(models.Model):
company = models.CharField(max_length=300)
desc = models.TextField()
text = models.TextField()
date = models.DateTimeField()
有一组公司
每个公司都有一个名为report
的实体
同一公司的year
中可以有多个reports
我想做的是制作一个multilevel dropdown
菜单。
-
第一层有公司名称。
当我们点击一个名称时,将显示该公司提交报告的年份列表。
当我们点击某一年时,会出现该年所有报告的列表。
当我在 php
工作时,我能够使用 3 个不同的查询来做到这一点。
-
第一个查询包含公司名称和提交报告的年数
第二个查询包含特定公司一年内的报告数量
第三个查询包含按公司名称升序排列的所有报表。
我只运行了 3 个嵌套循环,1 个代表公司数量,另一个代表该公司的年数,最后一个代表该公司一年内的报告数量,然后我只显示了来自列表。
我可以使用Manager.raw
执行相同的操作,但我无法遍历模板中的对象,因为只有此操作可用% for obejct in object_list %
。我需要两件事
-
去
number based for loop
相当于这个 php $row = mysql_fetch_array($query);
,它只是从查询列表中获取下一个元组。
预期输出我要显示的输出类型在我上传的屏幕截图中。
任何形式的帮助都深表感谢。
【问题讨论】:
【参考方案1】:我不确定为什么需要基于数字的 for 循环。普通迭代器是在 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 %
【讨论】:
澄清一下 这些列表company_list
、company_year_list
和company_report_list
将使用raw
查询填充,因为它们基本上是按不同属性分组的?
您提供的解决方案有一件事。我们正在循环遍历数据库中甚至可能不存在的组合,这不是最佳选择。如果我们可以有基于计数的 for 循环,那么我们可以获得每家公司每年的报告计数。并且使用所有报告的列表,我们可以遍历它们,并且可以使用之前的列表知道公司、年份和记录数量
Sachin,您不应该使用原始查询。看看extra
:***.com/questions/327807/…
乔丹你给我的链接只对view
部分有帮助。我仍然无法在模板中显示它,因为我无法使用计数遍历列表,即使我能做到这一点,我将如何检索下一个对象。我只能在 for 循环中进行迭代。希望我已经说清楚了
Sachin,我给你的代码是为了在模板中使用。我想我仍然不明白问题是什么。除非您有大量条目,否则嵌套循环不会效率低下,而且它确实是做您正在做的事情的唯一体面方法,因为您将它存储在关系数据库中。以上是关于如何在 django 模板中过滤 object_list的主要内容,如果未能解决你的问题,请参考以下文章