2016-12-31 95 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已經將該數字轉換爲百分比。