Django模板和循环遍历元素的列表
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 %}{% else %} {{ start_date|date:"Y/m/d" }} to {{ end_date|date:"Y/m/d" }} {{ publication_selected }} {{ download_all_period.nusage }} / {{ request_all_period.count }} {% endif %} {% endfor %} {{ start_date|date:"d/m/Y" }} to {{ end_date|date:"d/m/Y" }} {{ publication_selected }} {% trans 'No downloads/No requests' %}
它只显示我列表中的最后一个对象,而且我总是在{% else %}
部分中,而我可以为这个特定的对象打印统计信息。
问题的原因是在下载所有期间查询中使用了错误的聚合函数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模板中正确地循环遍历元素列表,并访问每个元素的相关信息。这样,我们就能够解决这个问题,并正确地处理下载所有期间查询中的数据。