我正在尝试根据子对象的计数在 Django 模板中运行条件测试。
我已将一个名为“productcodes”的变量传递给模板,我可以成功地迭代其中的每个项目。
型号
class Productcode(models.Model):
product_code = models.CharField(max_length=50)
def __str__(self):
return self.product_code
class Test(models.Model):
worksorder = models.ForeignKey(Worksorder, blank=True, null=True, on_delete=models.CASCADE,)
productcode = models.ForeignKey(Productcode, blank=True, null=True,on_delete=models.CASCADE)
tester = models.ForeignKey(Tester, blank=True, null=True,on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True, blank=True)
def __str__(self):
return self.date
{% if productcodes %}
{% for code in productcodes %}
<tr>
<th scope="row"><a href="show_productcode/{{ code.id }}"> {{ code }} </a></th>
{% if code.test_set.all.count < 1 %}
<td> 0 </td>
{% elif %}
<td>{{ code.test_set.all.count }}</td>
{% endif %}
<td>Future Dev WO</td>
</tr>
{% endfor %}
{% endif %}
我遇到的问题是 if 语句失败并出现以下错误: if 标记中的表达式意外结束。
{% if code.test_set.all.count < 1 %}
我已经在 shell 上测试了表达式,我是否遗漏了一些明显的东西?
致以诚挚的问候
科林。
我期待在表中打印子对象的计数。
虽然不是问题,但我建议不通过相关名称来计算项目数量:这将产生N+1问题,其中对于N元素,您将进行N+1查询:一个用于获取
Productcode
,然后一个 每个 Productcode
来获取相关的 Test
。
我们可以通过在视图中注释它来增强这一点,所以:
from django.db.models import Count
from django.shorcuts import render
def some_view(request):
productcodes = Productcode.objects.annotate(ntests=Count('test'))
return render(request, 'some-template.html', {'productcodes': productcodes})
然后我们可以使用:
{% for code in productcodes %}
<tr>
<th scope="row"><a href="show_productcode/{{ code.id }}"> {{ code }} </a></th>
{% if code.ntests < 1 %}
<td> 0 </td>
{% elif %}
<td>{{ code.ntests }}</td>
{% endif %}
<td>Future Dev WO</td>
</tr>
{% endfor %}
您还可以与:
{% for code in productcodes %}
<tr>
<th scope="row"><a href="show_productcode/{{ code.id }}"> {{ code }} </a></th>
{% if not code.ntests %}
<td> 0 </td>
{% elif %}
<td>{{ code.ntests }}</td>
{% endif %}
<td>Future Dev WO</td>
</tr>
{% endfor %}
{% url … %}
[Django-doc] 基于视图的 name 和参数生成路径。