Django模板和循环遍历元素的列表

9 浏览
0 Comments

Django模板和循环遍历元素的列表

我想循环遍历放入列表中的一些对象,并对每个对象进行统计。

我正在使用Django 1.11.16

用户可以选择一个或多个出版物,并且我会在列表中显示关于每个出版物的一些统计信息。

我有一个视图部分,如下所示:

def get_context_data(self, **kwargs):
    publication_list = self.request.GET.getlist('publication_list')
    publication_selected = Publication.objects.filter(id__in=publication_list)
    download_all_period = Download.objects.values('usage', 'doc__publication__pub_id') \
                    .filter(
                        doc__publication__id__in=publication_list) \
                    .filter(
                        Q(creation_date__gte=start_date) & Q(creation_date__lte=end_date))\
                    .aggregate(
                        nusage=Sum('usage'))
    request_all_period = Download.objects.values('doc__publication__pub_id')\
                    .filter(
                        doc__publication__id__in=publication_list)\
                    .filter(
                        Q(creation_date__gte=start_date) & Q(creation_date__lte=end_date))
    all_period_list = zip(publication_selected, download_all_period, request_all_period)
    context_data['publication_list'] = publication_list
    context_data['publication_selected'] = publication_selected
    context_data['download_all_period'] = download_all_period
    context_data['request_all_period'] = request_all_period
    context_data['all_period_list'] = all_period_list
return context_data

然后我有一个模板,里面有一个表格。所以我想循环遍历列表中的每个元素,以便为每个元素创建一行:

{% for publication_selected, download_all_period, request_all_period in all_period_list %}
  {% if download_all_period.nusage %}
    
      {{ start_date|date:"Y/m/d" }} to {{ end_date|date:"Y/m/d" }}
      {{ publication_selected }}
      {{ download_all_period.nusage }} / {{ request_all_period.count }}
    
  {% else %}
    
      {{ start_date|date:"d/m/Y" }} to {{ end_date|date:"d/m/Y" }}
      {{ publication_selected }}
      {% trans 'No downloads/No requests' %}
    
  {% endif %}
{% endfor %}

它只显示我列表中的最后一个对象,而且我总是在{% else %}部分中,而我可以为这个特定的对象打印统计信息。

0
0 Comments

问题的原因是在下载所有期间查询中使用了错误的聚合函数AGGREGATE,导致无法正确循环遍历元素列表。解决方法是使用正确的注释函数ANNOTATE。

在Django模板中,当我们需要循环遍历一个元素列表时,我们通常会使用for循环语句。然而,在这个特定的问题中,使用Django模板的for循环语句无法正常工作,因为查询中使用了错误的聚合函数AGGREGATE。

为了解决这个问题,我们需要在下载所有期间查询中使用正确的注释函数ANNOTATE。通过使用ANNOTATE函数,我们可以将每个元素的相关信息添加到查询结果中,使其能够正确地被for循环语句遍历。

下面是解决这个问题的具体步骤:

1. 打开下载所有期间查询的相关代码。

2. 查找使用了聚合函数AGGREGATE的部分。

3. 将聚合函数AGGREGATE替换为注释函数ANNOTATE。

4. 保存并重新运行代码。

以下是一个示例代码片段,展示了如何使用ANNOTATE函数来解决这个问题:

# 下载所有期间查询
periods = Period.objects.annotate(total_downloads=Count('download'))
# 循环遍历元素列表
for period in periods:
    # 打印每个元素的相关信息
    print(period.name, period.total_downloads)

通过使用正确的注释函数ANNOTATE,我们可以在Django模板中正确地循环遍历元素列表,并访问每个元素的相关信息。这样,我们就能够解决这个问题,并正确地处理下载所有期间查询中的数据。

0