如何在 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_listcompany_year_listcompany_report_list 将使用raw 查询填充,因为它们基本上是按不同属性分组的? 您提供的解决方案有一件事。我们正在循环遍历数据库中甚至可能不存在的组合,这不是最佳选择。如果我们可以有基于计数的 for 循环,那么我们可以获得每家公司每年的报告计数。并且使用所有报告的列表,我们可以遍历它们,并且可以使用之前的列表知道公司、年份和记录数量 Sachin,您不应该使用原始查询。看看extra:***.com/questions/327807/… 乔丹你给我的链接只对view部分有帮助。我仍然无法在模板中显示它,因为我无法使用计数遍历列表,即使我能做到这一点,我将如何检索下一个对象。我只能在 for 循环中进行迭代。希望我已经说清楚了 Sachin,我给你的代码是为了在模板中使用。我想我仍然不明白问题是什么。除非您有大量条目,否则嵌套循环不会效率低下,而且它确实是做您正在做的事情的唯一体面方法,因为您将它存储在关系数据库中。

以上是关于如何在 django 模板中过滤 object_list的主要内容,如果未能解决你的问题,请参考以下文章

Django - 如何在任何包含的模板中使用我的自定义过滤器?

如何根据 django 模板中的日期过滤列表

如何在 django 模板中过滤 object_list

Django 在模板标签中过滤和计数

如何获取相关项目的列表并在 Django 中应用模板过滤器

Django模板如何使用标签和模板过滤器从json dict中获取数据