Подтвердить что ты не робот

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, поведение которого в этом отношении явно не определено.: (

4b9b3361

Ответ 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%}