Найти - Пользователи
Полная версия: Переменная как аргумент фильтра шаблона
Начало » Django » Переменная как аргумент фильтра шаблона
1 2
ZZZ
Привет всем!

Джангу я изучаю совсем недавно и вот возникла трабла… Пытаюсь сделать такое:
<p class="post">
{{ post.body|apply_markup:"{{ post.markup.sys_name }}" }}
</p>
Но оно не работает – говорит, что для apply_markup обязателен аргумент.
Я понимаю, что это довольно фундаментальная проблема, но не знаю, как её обойти.

Делать, как показано ниже, не хочется совсем, так как типов разметки может быть много и для них есть специальная табличка (всё это больше в целях обучения!):
<p class="post">
{% ifequal post.markup.sys_name "linebreaks" %}
{{ post.body|apply_markup:"linebreaks" }}
{% endifequal %}
{% ifequal post.markup.sys_name "markdown" %}
{{ post.body|apply_markup:"markdown" }}
{% endifequal %}
</p>
ZZZ
Хм… Интересная идея. Этот фильтр из django-markup.
Я подумаю, как его правильно переписать.

Джанго-шаблоны мне одному кажутся убогими? Да, я не много шаблонных движков видел и поэтому не могу объективно судить, но с некоторыми простейшими вещами они не справляются.
Александр Кошелев
ZZZ
Джанго-шаблоны мне одному кажутся убогими? Да, я не много шаблонных движков видел и поэтому не могу объективно судить, но с некоторыми простейшими вещами они не справляются.
Может быть просто стоит научиться их готовить?

>>> Template('{{ foo|join:bar }}').render(Context({'foo': [1, 2], 'bar': '<br>'}))
u'1<br>2'
ZZZ
Daevaorn
Может быть просто стоит научиться их готовить?
Вполне возможно. :-) Это практически первое впечатление.
Я когда-то был знаком с шаблонами Zope…

Ещё вопрос… А можно ли получить из словаря данные, по ключу, хранящимуся в переменной? Т.е. что-то вроде такого:
{{ dictionary.{{ key_variable }} }}
Это у нас была реальная проблема – я передавал верстальщикам сырые данные, чтобы они их выводили, а потом выяснилось, что та конструкция циклов, которая у меня в голове, на питоне, прекрасно работает, не очень стыкуется с возможностями шаблонов. Пришлось передавать лишние, повторяющиеся данные и вся конструкция очень стала напоминать мои первые шаги в программировании.
Но вполне может быть, что мы не очень хорошо искали.

P.S. Большое спасибо, Daevaorn, за разрешение проблемы.
ZZZ
lorien
Нет, только если свой тэг или фильтр написать.
Ясно.

А каких-нить готовых либ расширения базового функционала шаблонов нету? А то как-то грустно…
Evg
Как всегда все повторяется.. Намерено шаблоны сделаны урезанными и не надо ничего расширять - меняйте подход.
ZZZ
Evg
Как всегда все повторяется.. Намерено шаблоны сделаны урезанными и не надо ничего расширять - меняйте подход.
Хм… Я всегда считал, что перед передачей данных во вью (MVC – в данном случае в шаблоны), нужно продумать схему этих данных. Схема должна быть понятной, но не избыточной.
Вью же должен иметь средства по обработки этих данных. В данном случае, это не очень соблюдается.

Допустим, есть дерево словарей с необходимыми данными.
Кроме этого дерева я передаю дополнительную информацию, а если точнее – имя активного элемента дерева.
Как мне, получить данные из активной ветви дерева? Я понимаю, что можно сделать цикл с вопросом “ifequal”… Но это же бред!

Ладно, посмотрим… Может я ещё не проникся идеей?
Evg
ZZZ
Вью же должен иметь средства по обработки этих данных
Шаблон должен заниматься только выводом, никаких расчетов он не должен делать.

ZZZ
Как мне, получить данные из активной ветви дерева?
Если нужно получить какие то данные внутри шаблона, то получение данных можно оформить зарание в виде метода и далее в шаблоне просто {{node.get_sub_node}} Таким образом логика оказалась не в шаблоне а внутри метода.

Другой вариант получения данных и их вывода это тег - на вход даете параметры {%process_data node %} на выходе шаблон с обработанными данными, которые подготовлены внутри ф-и тега.

Вообщем схема примерно такая:
view - это контроллер, те он получает входные данные вызывает обработчики бизнес логики и их результат передает в шаблон
шаблон - просто выводит данные (никаких расчетов)
сама обработка бизнес логики упрятана в методах моделей и менеджерах моделей.. или в каких то еще сторонних модулях

Так же надо стремится чтобы внутри вьюхи было как можно меньше бизнес логики - только вызовы бизнесс методов. Если вьюхи сильно распухшие значит что-то не то..
ZZZ
Evg
Шаблон должен заниматься только выводом, никаких расчетов он не должен делать.
Я немного не правильно описал. Вью (опять же, в терминах MVC) должен уметь получать данные.

Evg
Если нужно получить какие то данные внутри шаблона, то получение данных можно оформить зарание в виде метода и далее в шаблоне просто {{node.get_sub_node}} Таким образом логика оказалась не в шаблоне а внутри метода.

Другой вариант получения данных и их вывода это тег - на вход даете параметры {%process_data node %} на выходе шаблон с обработанными данными, которые подготовлены внутри ф-и тега.
Я тебе одно, ты мне другое.

Конкретизирую.
Я передаю словарь с данными и имя активного элемента: context = {data: {'a': 1, ‘b’: 2, ‘c’: 3}, key: ‘b’}.
Никаких рассчётов – вью должен уметь получить эту заветную двойку стандартными способами. Разве нет? Мне почему-то кажется, что это как бы элементарно…
Evg
ZZZ
Я передаю словарь с данными и имя активного элемента
Передавайте модели или объекты с подготовленными методами и все будет проще) Словарь с раскиданными фрагментами информации слишком сырые данные для шаблона.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB