Django HTML 标签 - 将 For 循环与条件语句合并

问题描述 投票:0回答:1

我正在使用 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'
html django tags
1个回答
0
投票

不要在模板中执行此操作。模板应该用于实现“渲染”逻辑,而不是“业务逻辑”。模板效率不是很高,而且还故意缺少各种工具来阻止人们这样做。 您可以使用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 %}
    

© www.soinside.com 2019 - 2024. All rights reserved.