Ron*_*ney 5 python django django-templates django-models django-views
使用 Django ~=1.11 和 Python 3.6
我是初学者!我在网上为我的问题找到的每个答案都比我正在寻找的更高级。
这是我的模型:
class Byte(models.Model):
text = models.CharField(max_length=30)
def __str__(self):
return self.text
Run Code Online (Sandbox Code Playgroud)
这是我的观点:
def byte_list(request):
bytes = Byte.objects.order_by('text')
return render(request, 'cloudapp/byte_list.html', {'bytes': bytes})
Run Code Online (Sandbox Code Playgroud)
这是我的模板:
{% block content %}
<div class="total">
<h2>Total number of words and phrases entered: {{ byte.count }}</h2>
</div>
<hr>
{% for byte in bytes %}
<div class="byte">
<h2>{{ byte.text }}</h2>
</div>
{% endfor %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
这允许在 /admin 中创建“Byte”对象,只有一个字段 - 一个小文本字段。现在,模板只显示所有创建的对象的列表。
问题/问题:我想显示为 Byte 模型创建的对象总数/计数。在模板中,我有一个标签 {{ byte.count }} 来显示它。
我试过使用 count() 和 Aggregation,但不确定如何将它们处理到我的模型/视图/模板中。我正在寻找最简单和最新的方法来实现这一点,无论是在模型中使用方法或 @property,还是在视图中设置某种类型的查询。
你有几个不同的选择……我见过的获取模型实例总数的最常见方法是:
my_total = len(Byte.objects.filter())
Run Code Online (Sandbox Code Playgroud)
或者,无需运行完整查询:
my_total = Byte.objects.count()
Run Code Online (Sandbox Code Playgroud)
这是 1.11 资源文档的链接:https : //docs.djangoproject.com/en/1.11/topics/db/aggregation/#cheat-sheet
Exprator 的答案没有任何问题,但另一种选择是使用内置length模板过滤器:
<h2>Total number of words and phrases entered: {{ bytes|length }}</h2>
Run Code Online (Sandbox Code Playgroud)
如果您不打算迭代bytes查询集,您也可以count直接在模板中调用它:
<h2>Total number of words and phrases entered: {{ bytes.count }}</h2>
Run Code Online (Sandbox Code Playgroud)
不过,这将强制进行第二次数据库查询,因此只有在不以其他方式导致bytes被评估的情况下才这样做。
决定在视图中放置什么以及如何使用模板过滤器/无参数方法更多的是风格问题,而不是硬性规定。使用视图的错误通常是正确的,这里它很简单,我可以在模板中执行它。