检查项目是否在日期内,否则打印默认值



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

我试过这样:

{% 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年6月1日
      • 395-2013年7月1日
      • 395-2013年8月1日
      • 395-2013年9月1日
      • 395-2013年10月1日
      • 395-2013年11月1日
    • Macbook
      • 499-2013年11月1日

我希望它显示如下:

  • 苹果
    • iMac
      • 缺失价值-2013年1月1日
      • 缺失价值-2013年2月1日
      • 价值缺失-2013年3月1日
      • 价值缺失-2013年4月1日
      • 价值缺失-2013年5月1日
      • 395-2013年6月1日
      • 395-2013年7月1日
      • 395-2013年8月1日
      • 395-2013年9月1日
      • 395-2013年10月1日
      • 395-2013年11月1日
      • 缺失价值-des。2013年1月1日

有人知道是否有可能做这件事吗?

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

  1. 为过滤器创建一个文件(即<YOUR_APP>/templatetags/<YOUR_FILTERS>.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
    

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

  2. 在您的模板代码中加载过滤器({% load <YOUR_FILTERS> %})并更改为:

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

    通过(根据您在评论中的要求更新为表格格式):

    <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等的任何属性。

<YOUR_APP>替换为django应用程序的名称,将<YOUR_FILTERS>替换为要用于过滤器文件的名称。

请注意,目录<YOUR_APP>/templatetags/中需要一个名为__init__.py的文件。

关于django文档中自定义过滤器的更多信息。

最新更新