代码之家  ›  专栏  ›  技术社区  ›  Stephen Brown

显示年份和日期嵌套列表的Django模板

  •  1
  • Stephen Brown  · 技术社区  · 8 年前

    我认为下面的代码。。。

    dates = Article.objects.dates('date', 'month').order_by('-date')
    

    它生成以下日期列表。。。

    [
        datetime.date(2016, 3, 1), datetime.date(2016, 1, 1), 
        datetime.date(2016, 1, 1), datetime.date(2015, 2, 1), 
        datetime.date(2015, 2, 1), datetime.date(2015, 1, 1),
        datetime.date(2015, 1, 1)
    ]
    

    我现在需要使用以下标记创建一个嵌套列表。。。

            <ul class="news-selector">
                <li><a href="todo">Year</a>
                    <ul>
                        <li><a href="todo">Month</a></li>
                    </ul>
                </li>
            </ul>
    

    我正在努力使用“changeif”或“regroup”,有人知道如何使用django模板系统来管理它吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   C14L    8 年前

    这会给你名单

    <ul class="news-selector">
      {% for y in dates %}
        {% ifchanged y.year %}
          <li><a href="todo">{{y|date:'Y'}}</a>
            <ul>
              {% for m in dates %}
                {% if m|date:'Y' == y|date:'Y' %}
                  <li><a href="todo">{{ m|date:'M' }}</a></li>
                {% endif %}
              {% endfor %}
            </ul>
          </li>
        {% endifchanged %}
      {% endfor %}
    </ul>
    
        2
  •  0
  •   Stephen Brown    8 年前

    我现在看到它在{%ifm|date:'Y'==Y|date:'Y'%}行中,通过更好地准备视图中的数据,我设法用更少的循环来完成它。

    date_list = Article.objects.dates('date', 'month', order='DESC')
    
    dates = []
    for date in date_list:
        dates.append({
            'year': str(date.year).rjust(4, '0'),
            'month': str(date.month).rjust(2, '0'),
            'month_name': date.strftime("%B")
        })
    

    在模板中。。。

                {% regroup dates by year as year_dates %}
    
                <ul class="news-selector">
                {% for year in year_dates %}
                    <li><a href="todo">{{year.grouper}}</a>
                        <ul>
                        {% for month in year.list %}
                            <li><a href="{% url 'news_filter' month.year month.month %}">{{month.month_name}}</a></li>
                        {% endfor %}
                        </ul>
                    </li>
                    {% endfor %}
                </ul>
    

    似乎有效,但可能可以改进。