【问题标题】:Django Template To Display Nested List Of Years And Dates显示年份和日期的嵌套列表的 Django 模板
【发布时间】:2025-11-23 04:10:01
【问题描述】:

我认为以下代码...

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 模板系统来管理它吗?

【问题讨论】:

    标签: django date nested templating


    【解决方案1】:

    这会给你列表

    <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】:

      我现在在 {% if m|date:'Y' == y|date:'Y' %} 行中看到它,通过在视图 a 中准备数据,我设法用更少的循环来做到这一点好一点。

      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>
      

      似乎有效,但可能需要改进。

      【讨论】:

        最近更新 更多