Django-templates: Почему {% if "string" | length> 10%} работает вообще?
Я использую Django 1.3. Если я поместил следующий фрагмент в свой шаблон:
{% if 'my string'|length > 10 %}{{ 'my string'|length }}{% endif %}
механизм рендеринга печатает "9". Единственное, о чем я могу думать, это то, что фильтр |length
возвращает строку, но это кажется странным в крайнем случае. Может ли кто-нибудь указать мне в правильном направлении?
Спасибо!
Edit:
Длина, которую я действительно хочу протестировать, получена из flatpage.title
, предоставленной django.contrib.flatpages
. По этой причине я предпочел бы не взламывать представление, чтобы предоставить информацию, необходимую мне для шаблона. Я надеялся, что могу просто использовать фильтр |length
, как описано в Django docs, здесь. Однако, как уже указывалось, единственный способ сделать это, похоже, также использовать фильтр |get_digit
, поведение которого в этом отношении явно не определено.: (
Ответы
Ответ 1
Да, фильтры всегда возвращают строку.
Вы можете добиться желаемой функциональности, вычислив длину строки в представлении и сделайте что-то вроде этого:
{% if str_length > 10 %}
{{ str_length }}
{% endif %}
Или создайте собственный фильтр для ваших нужд: http://code.djangoproject.com/wiki/BasicComparisonFilters
Отредактировано для опечатки
Ответ 2
Я рекомендую не использовать этот, но ранее я объединил фильтры get_digit
и length
, чтобы сделать эту работу.
{% if "12345678901234567890"|length|get_digit:"-1" > 20 %}
{{ "12345678901234567890"|length }}
{% endif %}
ничего не дает в шаблоне, но:
{% if "12345678901234567890"|length|get_digit:"-1" > 19 %}
{{ "12345678901234567890"|length }}
{% endif %}
приводит к:
20
.
Ответ 3
Попробуйте следующее условие:
{% if flatpage.title.10%}
Ответ 4
Лучшее решение - создать переменную, подобную этой:
{% with 'my_string'|length as string_length %}
your code when you have available as INT variable string_length
{% endwith %}
Надеюсь, это поможет всем.
Ответ 5
Собираемся играть здесь адвоката дьявола и спрашивать, почему это необходимо в первую очередь? Это одно, если вы вычисляете значение переменной, но если это жестко закодированное значение, просто поставьте его там в правильной форме. Все, что вы делаете, это добавление накладных расходов для чего-то статического.
Ответ 6
Я знаю, что уже поздно, но согласно django 2.1 ваш код будет работать. Пожалуйста, смотрите ниже ссылку https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#filters
{% if messages | length> = 100%} У вас сегодня много сообщений! {% endif%}