我正在使用 Django,我想知道是否有办法修改下面的标签,以便 for 循环在满足特定条件后停止迭代?
webpage.html
<div>
{% for person in crew.crew_set.all %}
{% if person.job|stringformat:'s' == 'Supervisor' %}
<div>Supervisor</div>
{% endif %}
{% endfor %}
</div>
上面的代码导致“Supervisor”被写入 50 次。我可以合并两个标签或以某种方式使用break语句,这样“Supervisor”只列出一次吗?
我没有列出我的模型/视图,因为我真的只是想更好地理解如何在我的 html 页面上使用标签。
详情:
模型.py
class Person(models.Model):
name = models.CharField(max_length=200)
class Jobs(models.Model):
jobcode = models.CharField(max_length=5)
name = models.CharField(max_length=200)
class Crew(models.Model):
jobnumber = models.ForeignKey(Jobs, on_delete=models.CASCADE)
person = models.ForeignKey(Person, on_delete=models.CASCADE)
role = models.CharField(max_length=200)
视图.py
class PersonPageView(DetailView):
model = Person
queryset = Person.objects.prefetch_related(
Prefetch('jobs_set', Jobs.objects.select_related('jobnumber')),
Prefetch('crew_set', Crew.objects.select_related('person'))
)
template_name = '_person_info.html'
请不要在模板中执行此操作。模板应该用于实现“渲染”逻辑,而不是“业务逻辑”。模板效率不是很高,而且还故意缺少各种工具来阻止人们这样做。
您可以使用Exists
子查询来检查这一点,这也会提高效率:
from django.db.models import Exists, OuterRef
class PersonPageView(DetailView):
model = Person
queryset = Person.objects.prefetch_related(
Prefetch('jobs_set', Jobs.objects.select_related('jobnumber')),
Prefetch('crew_set', Crew.objects.select_related('person')),
).annotate(
is_supervisor=Exists(
Crew.objects.filter(person_id=OuterRef('pk'), role='Supervisor')
)
)
template_name = '_person_info.html'
person
将会有一个额外的属性
.is_supervisor
,所以你可以使用:
{% if person.is_supervisor %}
…
{% endif %}