TemplateSyntaxError Не удалось проанализировать остаток

В моем шаблоне Django есть этот фрагмент jinja2:

{% 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 }} верен. Что мне здесь не хватает?

🤔 А знаете ли вы, что...
С Python можно создавать ботов для социальных сетей и мессенджеров.


1
55
2

Ответы:

Решено

Язык шаблонов Django не допускает сложных выражений, поэтому {{ x * 100 }}, каким бы простым оно ни казалось, не оценивается Django.

По сути есть три варианта:

1. используйте тег шаблона

тег шаблона {% widthratio … %} [Django-doc] по сути реализует правило трёх [wiki], хотя он больше предназначен для диаграмм. Он разделит на второй операнд, а затем умножит на третий и округлит результат, так:

{% 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. использовать джиндзю

Язык шаблонов Django не поддерживает некоторые функции. Это сделано намеренно, чтобы люди не могли писать бизнес-логику в шаблонах. В качестве языка шаблонов можно использовать Jinja, но это не обязательно и в некоторой степени контрпродуктивно, именно для того, чтобы не допустить написания бизнес-логики в шаблоне.


Один из способов — добавить фильтр шаблона без необходимости его подготовки в представлении.

https://docs.djangoproject.com/en/5.0/howto/custom-template-tags/#how-to-create-custom-template-tags-and-filters

умножение в шаблоне django без использования тега шаблона, созданного вручную