Вопрос:
Я хочу добиться чего-то подобного в шаблоне Django.
{{ variable.function(parameter) }}
Где variable – переменная, прошедшая через контекст к шаблону, в данном случае экземпляр модели. Я пробовал разные методы, но никто не работает.
Лучший ответ:
Это невозможно. Вы можете создать другую переменную и передать ее через контекст, чтобы вы могли ее использовать. Подобно:
context[‘result’] = variable.function(parameter)
На ваш взгляд. И в вашем шаблоне: {{result}}
Ответ №1
Это невозможно в шаблонах Django: они специально искалечены, чтобы разработчики шаблонов не стреляли в ногу. Логика состоит в том, что единственной логикой в шаблонах должна быть логика представления, и вся бизнес-логика должна храниться в представлении. Некоторые люди считают, что это достаточно справедливо, и некоторые считают, что это немного снисходительно (эти немые дизайнеры шаблонов недостаточно умен, чтобы безопасно использовать функции и методы).
Я могу думать о 3 вариантах:
- вместо этого используйте jinja2.
- напишите настраиваемый фильтр шаблонов.
- держите всю логику в представлении, где дизайнеры Django думают, что вы должны его сохранить.
Я не буду объяснять, как использовать Jinja2, потому что это уже объяснено в документах и потому, что пример в вопросе работает дословно, если вы переключитесь на него вместо собственных шаблонов Django. Это просто работает в Jinja2:
{{ variable.function(parameter) }}
Теперь решение фильтра шаблонов: сначала вы должны следовать соглашению о компоновке кода. Сам фильтр будет примерно таким:
# at your_tag_library.py @register.filter(name=’call_with’) def apply_callable(callable, arg): return callable(arg)
Затем в шаблоне вы можете:
{% load your_tag_library %} {{ variable.function|call_with:parameter }}
Конечно, последний вариант – тот, который отвечает от Daniel, – прекомпретирует значение в представлении и просто отображает результат в шаблоне:
context[‘result’] = variable.function(parameter)
А в вашем шаблоне вам просто нужен {{ result }}.