Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Переменная как аргумент фильтра шаблона [RSS Feed]

#1 Май 2, 2010 00:16:59

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Переменная как аргумент фильтра шаблона

Привет всем!

Джангу я изучаю совсем недавно и вот возникла трабла… Пытаюсь сделать такое:

<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>



Офлайн

#2 Май 2, 2010 12:45:05

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Переменная как аргумент фильтра шаблона

Хм… Интересная идея. Этот фильтр из django-markup.
Я подумаю, как его правильно переписать.

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



Офлайн

#3 Май 2, 2010 12:59:49

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Переменная как аргумент фильтра шаблона

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

>>> Template('{{ foo|join:bar }}').render(Context({'foo': [1, 2], 'bar': '<br>'}))
u'1<br>2'



Офлайн

#4 Май 2, 2010 14:37:12

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Переменная как аргумент фильтра шаблона

Daevaorn
Может быть просто стоит научиться их готовить?
Вполне возможно. :-) Это практически первое впечатление.
Я когда-то был знаком с шаблонами Zope…

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

P.S. Большое спасибо, Daevaorn, за разрешение проблемы.



Офлайн

#5 Май 3, 2010 11:27:18

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Переменная как аргумент фильтра шаблона

lorien
Нет, только если свой тэг или фильтр написать.
Ясно.

А каких-нить готовых либ расширения базового функционала шаблонов нету? А то как-то грустно…



Офлайн

#6 Май 3, 2010 14:57:04

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

Переменная как аргумент фильтра шаблона

Как всегда все повторяется.. Намерено шаблоны сделаны урезанными и не надо ничего расширять - меняйте подход.



Офлайн

#7 Май 3, 2010 15:43:08

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Переменная как аргумент фильтра шаблона

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

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

Ладно, посмотрим… Может я ещё не проникся идеей?



Офлайн

#8 Май 3, 2010 16:03:01

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

Переменная как аргумент фильтра шаблона

ZZZ
Вью же должен иметь средства по обработки этих данных
Шаблон должен заниматься только выводом, никаких расчетов он не должен делать.

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

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

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

Так же надо стремится чтобы внутри вьюхи было как можно меньше бизнес логики - только вызовы бизнесс методов. Если вьюхи сильно распухшие значит что-то не то..



Отредактировано (Май 3, 2010 16:13:09)

Офлайн

#9 Май 3, 2010 16:22:52

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Переменная как аргумент фильтра шаблона

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

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

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

Конкретизирую.
Я передаю словарь с данными и имя активного элемента: context = {data: {'a': 1, ‘b’: 2, ‘c’: 3}, key: ‘b’}.
Никаких рассчётов – вью должен уметь получить эту заветную двойку стандартными способами. Разве нет? Мне почему-то кажется, что это как бы элементарно…



Офлайн

#10 Май 3, 2010 16:45:25

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

Переменная как аргумент фильтра шаблона

ZZZ
Я передаю словарь с данными и имя активного элемента
Передавайте модели или объекты с подготовленными методами и все будет проще) Словарь с раскиданными фрагментами информации слишком сырые данные для шаблона.



Офлайн

  • Начало
  • » Django
  • » Переменная как аргумент фильтра шаблона[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version