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

时间:2013-11-28 09:57:44

标签: django django-templates

我有一个对象列表我试图连续几个月,我的问题不是每个对象都有每个月的日期。

我试过这样:

{% 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 - jun。 1,2013
      •                             
      • 395 - jul。 1,2013
      •                             
      • 395 - 8月。 1,2013
      •                             
      • 395 - 9月1,2013
      •                             
      • 395 - oct。 1,2013
      •                             
      • 395 - nov。 1,2013
      •                         
                          
    •                     
    • 的MacBook                         
                                    
      • 499 - nov。 1,2013
      •                         
                          
    •             
            

我希望它显示如下:

        
  • 苹果             
                          
    • 的iMac                         
                                    
      • 缺少价值 - jan。 1,2013
      •                             
      • 缺少价值 - 非常。 1,2013
      •                             
      • 缺少价值 - 3月1,2013
      •                             
      • 缺少价值 - apr。 1,2013
      •                             
      • 缺少价值 - 可能。 1,2013
      •                             
      • 395 - jun。 1,2013
      •                             
      • 395 - jul。 1,2013
      •                             
      • 395 - 8月。 1,2013
      •                             
      • 395 - 9月1,2013
      •                             
      • 395 - oct。 1,2013
      •                             
      • 395 - nov。 1,2013
      •                             
      • 缺少价值 - des。 1,2013
      •                         
                          
    •             
            

如果有可能的话,任何人都会知道吗?

1 个答案:

答案 0 :(得分: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. 在模板代码中加载过滤器({% load <YOUR_FILTERS> %})并更改此内容:

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

    by(更新格式为您在评论中提出的格式):

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

  3. 以您的django应用名称<YOUR_APP>替换您要用于过滤器文件的名称<YOUR_FILTERS>

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

    有关django docs中自定义过滤器的详情。