2016-12-31 75 views
0

我是Django的新手,我被困在模板标签上,我无法弄清楚如何工作。我知道我在我看来缺少了一些东西,但是我用几种不同的方式写了它,似乎无法找到正确的方法来做到这一点。我在我的应用程序中有一个Morris图表,我试图提供信息。我想显示可用运营商的百分比。在我的模型中,我有一个布尔值,表示操作符是否可用。当我将它传递回模板时,我希望模板标记可以运行百分比并将值传递回morris饼图。布尔值的Django模板标签

这是我的观点:

@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" 
+0

你有什么错误或问题? –

+0

我无法让它将值传递给可以处理的模板标签。我可以通过true或false或

回答

0

它仍然是一个有点混乱什么你实际上想要实现以及你的Operators模型实际上是什么样子以及你的变量是什么值包含。但我会尽力猜测你想做什么,并试图给你一个答案。

看起来好像您将operatorsoperators_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)

Inside percentage_of然后,您尝试将数学应用于这些布尔值(float(part)/whole * 100),或实际上更像float(True)/True * 100

解决方案

请确保您传递到环境中的值的格式为你希望它。它目前看起来像你认为你传递的是浮点值,但实际上是传递布尔值。在将模板标签应用于它们之前,尝试调试或打印这些值。

0

operatorsoperator_status变量需要是数字按马库斯·林德的回答是:在你的代码,operators变量是操作对象的查询集,而operator_status是一个列表。让你的代码工作的最简单的方法是:

operators = Operator.objects.count() 
operator_status = Operator.objects.filter(is_available=True).count() 

且模板中,你需要在这两个参数传递给您的自定义过滤器(局部和整体):

{{ operators_available|percentage_of:operators }} 

而且我不认为你不希望[2:]的字符串格式化,因为你的* 100已经将该数字转换为百分比。