【问题标题】:Reset forloop counter in django template nested for loop在嵌套for循环的django模板中重置forloop计数器
【发布时间】:2021-05-23 01:00:47
【问题描述】:

如何重置django模板中的forloop计数器?

这是我当前的查询集:

context['major'] = Major.objects.all().filter(is_active=True).order_by('id')
context['minor'] = Minor.objects.all().filter(is_active=True).order_by('id')

这是我的模特:

class Major(models.Model):
    major_name = models.CharField(max_length=100, default='', null=False)
    is_active = models.BooleanField(default=True, null=False)
    
    def __str__(self):
        return self.major_name

class Minor(models.Model):
    major_name = models.ForeignKey(Major, on_delete=models.CASCADE)
    minor_name = models.CharField(max_length=100, default='', null=False)
    is_active = models.BooleanField(default=True, null=False)
    
    def __str__(self):
        return self.minor_name

所以我有这样的事情:

{% for major in majors %}
    {% for minor in minors %}
        {% if minor.major_name == major %}
            {{forloop.counter}} {{minor}}
        {% endif %}
    {% endfor %}
{% endfor %}

当前输出:

major1
    1 minor1
    2 minor2
major2
    3 minor3
    4 minor4
    5 minor5
    ...

我希望它显示如下内容:

major1
    1 minor1
    2 minor2
major2
    1 minor3
    2 minor4
    3 minor5
    ...

【问题讨论】:

  • 您能否将majorsminors 模型和查询集添加到您的问题中?更改您定义或迭代数据的方式可能会更容易,因为像您要求的那样“重置”forloop 计数器并非微不足道/可能
  • 添加了我的查询集。
  • 我也尝试在模板中添加 {%with%} 标签,但我认为我不能从标签中增加变量
  • 你也可以添加模型吗?
  • 也添加了...

标签: django


【解决方案1】:

您似乎想要实现的是显示与过滤和索引的Major 实例相关的所有Minor 实例。

您可以将Prefetch 对象传递给prefetch_related 以将过滤器添加到相关查询集(major.minor_set) 以获取反向关系,而不是一次又一次地循环遍历所有过滤的Minor 实例,然后循环遍历那个

context['majors'] = Major.objects.filter(
    is_active=True
).prefetch_related(
    Prefetch('minor_set', queryset=Minor.objects.filter(is_active=True).order_by('id'))
).order_by('id')

然后在模板中

{% for major in majors %}
    {% for minor in major.minor_set.all %}
        {{ forloop.counter }} {{ minor }}
    {% endif %}
{% endfor %}

【讨论】:

  • 感谢您的回复。实施后出现错误minor_set' is an invalid parameter to prefetch_related()
  • 和 django 指向的专业是专业。
  • Minor -> Major 外键与您的问题中描述的完全一样吗?它没有related_name,所以反向关系必须命名为minor_set?
  • 次要 -> 主要 ForeignKey 是的。但没有相关名称。
  • 使用您的模型在本地运行测试对我来说效果很好。完整的错误信息是什么?是否以Cannot find 'minor_set' on Major object开头?
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2012-10-25
  • 2019-08-02
  • 2021-02-14
相关资源
最近更新 更多