TemplateSyntaxError Не удалось разобрать остаток
У меня есть этот кусочек jinja2 в шаблоне Django:
{% for filesystem, total_quota, total_usage, df_usage in totals_by_filesystem %}
<tr>
<td>{{ filesystem }}</span></td>
<td>{{ total_quota | filesizeformat }}</td>
<td>{{ total_usage | filesizeformat }}</td>
<td>{{ df_usage * 100 }}</td>
</tr>
{% endfor %}
Когда я запускаю его, то получаю следующее сообщение об ошибке:
Exception Type: TemplateSyntaxError
Exception Value:
Could not parse the remainder: ' * 100' from 'df_usage * 100'
Я уверен, что мой синтаксис {{ df_usage * 100 }}
правильный. Что я упустил?
Язык шаблонов Django не допускает сложных выражений, поэтому {{ x * 100 }}
, каким бы простым он ни казался, не оценивается Django.
Есть три основных варианта:
1. используйте тег шаблона
the {% widthratio … %}
template tag [Django-doc] essentially implements the rule of three [wiki], although this is more designed for charts. It will divide by the second operand, and then multiply by the third and round the result, so:
{% widthratio df_usage 1 100 %}
делит на единицу (без эффекта) умножает на 100, а затем округляет результат.
2. Подготовьте результат в представлении
Вместо того чтобы выполнять арифметику в представлении, что также не очень эффективно, вы можете подготовить элементы в представлении с помощью:
totals_by_filesize = [
(filesystem, total_quota, total_usage, 100 * df_usage)
for (filesystem, total_quota, total_usage, df_usage) in totals_by_filesystem
]
3. используйте джинджу
Язык шаблонов Джанго не поддерживает несколько функций, это было сделано намеренно, чтобы помешать людям писать бизнес-логику в шаблонах. Можно использовать Jinja в качестве языка шаблонов, но это не обязательно и в некоторой степени контрпродуктивно, именно для того, чтобы предотвратить написание бизнес-логики в шаблоне.
Один из способов - добавить фильтр шаблона без необходимости его подготовки в представлении.
умножение в шаблоне django без использования созданного вручную тега шаблона