2016-07-11 2 views
-1

Похож на вопрос, который должен быть уже рассмотрен, но, проведя некоторое время, я не нашел, как проверить, что переменная является числовой в шаблоне Django. Что-то вродеDjango test, если переменная является числовой

{% 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" }} 

EDIT: Нет, вызывает исключение, если задана строка.

+2

Код этого фильтра: 'return int (value)% int (arg) == 0', поэтому он может генерировать исключения, такие как' ValueError: invalid literal for int() с основанием 10: «что-то». Я не хочу этого проверять. – frnhr

+0

Да, я тестировал его, и он вызывает исключение со строкой. – navit

Смежные вопросы