Шаблон Django: используйте результат фильтра в качестве аргумента для второго фильтра

Чего я хотел бы добиться, так это сделать расчет в шаблоне Django. В простой математике это будет:

section_angle = base_angle + ( sections_length / current_iteration_counter_over_sections)

При попытке перевести его в шаблон Django я думаю, что это может быть что-то вроде:

{% for section in sections %}
    {% with base_angle|add:sections|length|divides:forloop.counter0 as section_angle %}

С пользовательским фильтром разделяет, который выглядит как

def divides(value, param):
    return float(param)/float(value)

Я немного запутался в том, как это организовать, в порядке фильтров и аргументов, которые я должен использовать. В показанном здесь примере это приводит к ошибке: Обнаружена ошибка ValueError при рендеринге: не удалось преобразовать строку в число с плавающей запятой:

Бонусный вопрос: я пытался добавить скобки для пояснения, но механизму шаблонов, похоже, это не нравится.


person challet    schedule 21.06.2013    source источник
comment
разве sections|length не должно быть sections_length?   -  person J0HN    schedule 21.06.2013
comment
Хотя вы могли бы добиться этого, но чтобы он оставался читабельным, я бы просто создал тег шаблона, чтобы добиться того же.   -  person karthikr    schedule 21.06.2013
comment
почему бы просто не сделать тег шаблона, чтобы сделать весь расчет?   -  person Timmy O'Mahony    schedule 21.06.2013
comment
@J0HN в математическом примере это называется sections_length, чтобы было понятнее, но в коде я должен использовать фильтр длины   -  person challet    schedule 21.06.2013
comment
@TimmyO'Mahony & karthikr: я думаю, это единственный разумный поступок :)   -  person challet    schedule 21.06.2013
comment
Я думаю, что это может быть источником ошибки. Фильтры применялись один за другим, поэтому ваша конструкция читается как ((base_angle|add:sections)|length), а вы имели в виду base_angle|add:(sections|length). Но я не уверен :). Короче говоря, вы пытаетесь манипулировать им по-умному, но это работает не совсем так, как вы думаете. Так что лучше сделать это как-нибудь по-другому.   -  person J0HN    schedule 21.06.2013
comment
Совет @challet: слой представления не должен делать этого, используйте теги шаблона только для проблем с представлением/дизайном. расчет, который вы пытаетесь сделать, должен выполняться на уровне модели/контроллера.   -  person YardenST    schedule 21.06.2013
comment
@YardenST хорошо, это можно рассматривать как проблемы с дизайном, поскольку цель состоит в том, чтобы создать SVG-представление (может быть предметом моего следующего вопроса ^^) разделов. манипуляции с переменными, которых я пытаюсь достичь, больше переводят элементы списка в угловые элементы, чем выполняют сложные вычисления. Но да, не помешало бы использовать метод модели listToAngle   -  person challet    schedule 21.06.2013


Ответы (1)


Не делай этого. Система шаблонов Django не место для такой логики. Прочитайте философские комментарии о шаблонах в Официальный сайт Джанго:

Если у вас есть опыт программирования или вы привыкли к языкам, которые смешивают программный код непосредственно с HTML, вам следует иметь в виду, что система шаблонов Django — это не просто Python, встроенный в HTML. Так задумано: система шаблонов предназначена для выражения представления, а не логики программы.

Я думаю, что комментарий Тимми правильный, поместите всю логику в собственный фильтр.

person Cartucho    schedule 22.06.2013