Django 模板 - 访问子模型/运行条件测试的问题

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

我正在尝试根据子对象的计数在 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 上测试了表达式,我是否遗漏了一些明显的东西?

致以诚挚的问候

科林。

我期待在表中打印子对象的计数。

django django-templates
1个回答
0
投票

虽然不是问题,但我建议通过相关名称来计算项目数量:这将产生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 和参数生成路径。

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