布尔值的 Django 模板标签
Posted
技术标签:
【中文标题】布尔值的 Django 模板标签【英文标题】:Django Template Tag for Boolean Value 【发布时间】:2017-05-15 06:01:02 【问题描述】:我是 Django 新手,我被困在一个模板标签上,我不知道如何开始工作。我知道在我看来我遗漏了一些东西,但我已经用几种不同的方式编写了它,似乎找不到正确的方法来做到这一点。我的应用程序中有一个莫里斯图表,我正在尝试向其提供信息。我想显示可用运算符的百分比。在我的模型中,我有一个布尔值,表示运算符 is_available。当我将它传回模板时,我希望模板标签运行百分比并将值传回莫里斯饼图。
这是我的看法:
@login_required(login_url='login/')
def operator(request):
operators = Operator.objects.all()
operator_status = Operator.objects.values_list('is_available', flat=True)
context =
'operators': operators,
'operators_available': operator_status,
return render(request, 'content/operator.html', context)
这是正在使用的模板标签:
<div class="widget-detail-1">
<h2 class="p-t-10 m-b-0"> operators_available | percentage_of:True </h2>
</div>
</div>
最后是我的模板标签:
@register.filter(name='percentage_of')
def percentage_of(part, whole):
try:
return "%d"[2:] % (float(part) / whole * 100)
except (ValueError, ZeroDivisionError):
return "Division by Zero"
【问题讨论】:
您遇到了什么错误或问题? 我无法让它将值传递给可以处理的模板标签。我可以传递 true 或 false 或您真正想要实现的目标、Operators
模型的实际外观以及变量包含的值仍然有点令人困惑。但我会尽量猜测你想做什么,并尝试给你一个答案。
似乎您将operators
和operators_available
的使用混合在一起,并且您还混合了浮点数和布尔值等数据类型的使用。
让我们看看你的代码...
# This returns all Model Instances of Operators.
operators = Operator.objects.all()
# This only returns a list of Booleans. E.g. [True, True, False, True, True]
operator_status = Operator.objects.values_list('is_available', flat=True)
在您的模板中,您编写以下内容
<h2 class="p-t-10 m-b-0"> operators_available | percentage_of:True </h2>
这等于percentage_of(operators_available, True)
的函数调用。还要记住 operators_available
来自您的 .valus_list('is_available')
并且是一个布尔值。所以你实际上在做的是percentage_of(True, True)
。
在percentage_of
中,您可以尝试使用(float(part) / whole * 100)
或实际上更像float(True) / True * 100
将数学应用于这些布尔值。
解决方案
确保您传递给上下文的值是您期望的格式。目前看起来您认为您正在传递浮点值,但实际上是在传递布尔值。在将模板标签应用到它们之前尝试调试或打印这些值。
【讨论】:
【参考方案2】:您的 operators
和 operator_status
变量必须是根据 Marcus Lind 的回答的数字:在您的代码中,operators
变量是 Operator 对象的查询集,而 operator_status
是一个列表。让您的代码工作的最简单方法是:
operators = Operator.objects.count()
operator_status = Operator.objects.filter(is_available=True).count()
在您的模板中,您需要将这两个参数传递给您的自定义过滤器(部分和整体):
operators_available|percentage_of:operators
另外,我认为您不希望在字符串格式中使用 [2:]
,因为您的 * 100
已经将数字转换为百分比。
【讨论】:
以上是关于布尔值的 Django 模板标签的主要内容,如果未能解决你的问题,请参考以下文章