【问题标题】:Check if item is in date, else print default检查项目是否在日期内,否则打印默认值
【发布时间】:2013-12-14 07:10:30
【问题描述】:

我有一个我试图按月获取的对象列表,我的问题不是每个对象都有每个月的日期。

我试过这样:

{% regroup object_list|dictsort:"store.id" by store as store_list %}
<ul>
    {% for store in store_list %}
    <li>{{ store.grouper }}


        {% regroup store.list|dictsort:"product" by product as product_list %}
        <ul>
            {% for product in product_list %}
                <li>{{ product.grouper }}
                    <ul>
                        {% for item in product.list|dictsort:"date" %}
                        <li>{{ item.price }} - {{ item.date|date }}</li>
                        {% endfor %}
                    </ul>
                </li>
            {% endfor %}
        </ul>
    </li>
    {% endfor %}
</ul>

这个给我:

  • 苹果
    • iMac
      • 395 - 六月。 2013 年 1 月 1 日
      • 395 - 七月。 2013 年 1 月 1 日
      • 395 - 8 月2013 年 1 月 1 日
      • 395 - 9 月。 2013 年 1 月 1 日
      • 395 - 十月。 2013 年 1 月 1 日
      • 395 - 11 月2013 年 1 月 1 日
    • Macbook
      • 499 - 11 月2013 年 1 月 1 日

我希望它显示如下:

  • 苹果
    • iMac
      • 缺失值 - 1 月。 2013 年 1 月 1 日
      • 缺失值 - 2 月。 2013 年 1 月 1 日
      • 缺少值 - 3 月。 2013 年 1 月 1 日
      • 缺失值 - 4 月。 2013 年 1 月 1 日
      • 缺失值 - 可能。 2013 年 1 月 1 日
      • 395 - 六月。 2013 年 1 月 1 日
      • 395 - 七月。 2013 年 1 月 1 日
      • 395 - 8 月2013 年 1 月 1 日
      • 395 - 9 月。 2013 年 1 月 1 日
      • 395 - 十月。 2013 年 1 月 1 日
      • 395 - 11 月2013 年 1 月 1 日
      • 缺失值 - des。 2013 年 1 月 1 日

有人知道这是否可行吗?

【问题讨论】:

  • 你想把没有日期的条目放在哪里?
  • 抱歉,可能不清楚,但不是每个对象每个月都有一个日期条目,有些对象只有 11 月和 Des 的日期,有些对象每个月都有一个日期。如果该月没有日期条目,我想显示一个 - 字符。
  • 它仍然令人困惑,你能告诉我们你的object_list

标签: django django-templates


【解决方案1】:

您可以使用模板过滤器解决问题:

  1. 为过滤器创建一个文件(即&lt;YOUR_APP&gt;/templatetags/&lt;YOUR_FILTERS&gt;.py)并添加以下代码:

    from django.template import Library
    from django.utils.datetime_safe import datetime
    
    register = Library()
    
    @register.filter
    def full_month_price_list(value):
        month_list = [[datetime(2013, i, 1)] for i in xrange(1, 13)]
        for item in value:
            month_list[item.date.month - 1].append(item)
        return month_list
    

    此过滤器获取具有日期属性的项目列表并返回一个包含 2 个元素的 12 个列表的列表:日期和项目

  2. 在您的模板代码中加载过滤器 ({% load &lt;YOUR_FILTERS&gt; %}) 并更改:

    <ul>
        {% for item in product.list|dictsort:"date" %}
            <li>{{ item.price }} - {{ item.date|date }}</li>
        {% endfor %}
    </ul>
    

    by(已更新为您在 cmets 中要求的表格格式):

    <table>
        {% for item in product.list|full_month_price_list %}
        <tr>
            <td>{{ item.0|date:"b. j, Y" }}</td>
            <td>{{ item.1.price|default:"MISSING VALUE" }}</td>
        </tr>
        {% endfor %}
    </table>
    

    请注意,您可以访问产品item.1.dateitem.1.priceitem.1.pk等的任何属性。

&lt;YOUR_APP&gt; 替换为您的django 应用程序的名称,将&lt;YOUR_FILTERS&gt; 替换为您要用于过滤器文件的名称。

请注意,&lt;YOUR_APP&gt;/templatetags/ 目录中需要一个名为 __init__.py 的文件。

django docs 中有关自定义过滤器的更多信息。

【讨论】:

  • 感谢您的回答!我试过你的代码,但我得到一个list assignment index out of range 错误。知道有什么问题吗? pastebin.com/qWvR5MaD
  • 我看到你对问题的改变,如果你想要"MISSING VALUE - ",我的回答需要做一些小的改动
  • MISSING VALUE - 不是最重要的,所以如果很难添加,请不要打扰。我试过你的新代码,我得到list index out of range 错误。
  • 抱歉,我忘记将用作列表索引的月份数减少 1,因此需要将 item.date.month 替换为 item.date.month - 1(出现两次),我将更新我的回答,请用此修复再次测试
  • 好的,可以了。但是,如果我需要显示更多字段,并将每个值/字段放在新的 &lt;td&gt;&lt;/td&gt; 中怎么办?
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 2021-07-27
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2018-02-14
  • 2018-10-10
  • 2019-04-06
相关资源
最近更新 更多