2016-07-11 63 views
-1

看起來像一個應該已經被覆蓋的問題,但花了一些時間之後,我沒有找到如何在Django模板中檢查變量是數字。 喜歡的東西Django測試變量是否爲數字

{% if my_var.isnumeric %} 
    # do something 
{% endif %} 

UPDATE 當我從下面的討論中瞭解到,人們似乎沒有內置標籤來檢查這一點,我們最終不得不創建自己的模板標籤。

+0

你可以使自己的模板標籤,但機會是,這將只是掩蓋了一些見不得人的邏輯,爲什麼不會是多少? – Sayse

+0

Yeap,我已經掌握了用戶定義模板標籤的技巧。問題是,是否有內置標籤 –

+2

問題是,您爲什麼需要它?爲什麼*不會是數字? – Sayse

回答

1

假設「數字」的意思是「只包含數字」(沒有小數點,沒有減號,等)

自定義過濾器是你最好的選擇:

from django import template 

register = template.Library() 


@register.filter(is_safe=True) 
def is_numberic(value): 
    return "{}".format(value).isdigit() 

文檔有關自定義模板過濾器:https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/

使用模板:

{% load your_custom_lib %} 
... 
{% if something|is_numberic %}... 

如果考慮整數作爲數字(正面和負面的),則函數變爲:

try: 
    int("{}".format(value)) 
except ValueError: 
    return False 
else: 
    return True 

如果「數字」的意思是「整數或浮點數」,然後使用float代替int。但請注意,這也將認識到-12E3的數字,這是因爲:

>>> -12E3 
-12000.0 
+0

Emm,@frnhr,我確實假設「數字」可以包含小數點,減號等。我不想尋找定製的解決方案。問題是要確保沒有內置的快捷方式,我不會重新發明輪子:) –

+0

@EdgarNavasardyan沒有內置的解決方案AFAIK,所以我們不會重新發明輪子:) – frnhr

1

這是行不通的嗎?

{{ value|divisibleby:"1" }} 

編輯:不,如果給出字符串,會引發異常。

+2

這個過濾器背後的代碼是:'返回int(value)%int(arg)== 0',所以它可能會引發例如'ValueError:invalid literal for int()基地10:'東西'。我_思考_,沒有測試過它。 – frnhr

+0

是的,我測試了它,它引發了一個字符串異常。 – navit