Как вызвать переменную функцию с параметром в шаблоне django?

Вопрос: Я хочу добиться чего-то подобного в шаблоне Django. {{ variable.function(parameter) }} Где variable - переменная, прошедшая через контекст к шаблону, в данном случае экземпляр модели. Я пробовал разные методы, но никто не работает. Лучший ответ: Это невозможно. Вы можете создать другую переменную и передать ее через контекст, чтобы вы могли ее использовать. Подобно: context['result']

Вопрос:

Я хочу добиться чего-то подобного в шаблоне Django.

{{ variable.function(parameter) }}

Где variable – переменная, прошедшая через контекст к шаблону, в данном случае экземпляр модели. Я пробовал разные методы, но никто не работает.

Лучший ответ:

Это невозможно. Вы можете создать другую переменную и передать ее через контекст, чтобы вы могли ее использовать. Подобно:

context[‘result’] = variable.function(parameter)

На ваш взгляд. И в вашем шаблоне: {{result}}

Ответ №1

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

Я могу думать о 3 вариантах:

  1. вместо этого используйте jinja2.
  2. напишите настраиваемый фильтр шаблонов.
  3. держите всю логику в представлении, где дизайнеры 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 }}.

Оцените статью
Добавить комментарий