| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Шаблоны Django. Наследование.
Прочитал статью «Фрагментарное кэширование в MVC веб-фреймворках». Статья описывает проблему кеширования фрагмета отображения, а именно проблему полного разделения контроллера и отображения - контроллер отрабатывает полностью до вызова отображения. Если в отображении мы кешируем фрагмент, это ничего не меняет - контроллер-то уже отработал! В статье описан способ этого избежать: сделать запрос данных "ленивым". Начав писать, как это должно быть сделано правильно, решил написать, как устроены шаблоны Django, чтобы не-джанговодам тоже было понятно. Как это сделано в Django? Структура шаблонов DjangoУправляющими элементами шаблонов Django являются переменные, фильтры и теги. При рендеринге шаблона переменные заменяются на свое значение, вычисленное в
контексте вызова. Синтаксис - двойные фигурные скобки - например: Фильтры служат для простых преобразований переменных. Синтаксис - При рендеринге шаблона теги, грубо говоря, заменяются на результаты работы
ассоциированной с этим тегом функции на питоне. Синтаксис: Программист может написать свои фильтры и теги, но об этом позже. Кроме того, есть три специальных тега: Все выше перечисленное тривиально и в той или иной форме есть в любом движке
шаблонов. Теперь перейдем к особенностям Django: на тегах block и Наследование шаблоновОсновная фишка шаблонов Django - наследование. Шаблон может расширять (уточнять) поведение родительского шаблона. Любой участок шаблона может быть обернут в блочный тег (естественно, что тег не может начинаться перед, а заканчиваться внутри цикла). Блоку дается имя. Например: {% block content %}
тело блока
{% endblock %}
При помощи тега extend мы указываем, какой шаблон мы будем уточнять. Расширяя шаблон, мы можем переопредилить любые блоки, которые есть в родительском шаблоне. Все, что находится вне этих блоков, будет пропущено. Получается мощный механизм, практически исключающий необходимость повторения частей шаблонов. Вкратце это описано в документации (см. ссылки в конце статьи). Давайте разберем реальный пример. Пример наследования шаблоновДопустим, мы хотим сделать сайт, содержащий простые страницы и блог. От верстальщика мы получили макет страницы, содержащий:
Вот как это выглядит:
Для всех указанных элементов мы создаем соответствующие блочные теги. Простая страница ложится в этот макет - у нее есть только заголовок и тело. Теперь перейдем к блогу. В блоге хотелось бы добавить правую колонку для вывода списка тегов и последних статей. Возможно мы захотим добавить правую колонку к каким-нибудь другим страницам сайта. Чтобы избежать копирования "двухколоночности", вынесем ее в отдельный шаблон, переопределив тело страницы у базового.
В блоге будет несколько типов страниц:
У всех страниц правая колонка остается неизменной, поэтому разумно сделать базовую страницу для блога, наследуя ее от двухколоночной базовой страницы.
Теперь приведем примеры внутренних страниц блога (все они наследуются от базовой страницы блога). Список статей:
Статья:
Список статей, у которых есть определенный тег:
В данном случае, мы воспользовались еще одной хитростью. Ведь этот список
ничем не отличается от простого списка статей - он просто отфильтрован по
дополнительным параметрам. Поэтому мы унаследовали его от списка статей и при
перекрытии тела использовали тег Как видно, каждый шаблон очень конкретен и отвечает только за свою функциональность. Ему нет необходимости знать о всей странице в целом. Поклонники других шаблонных систем скажут, что для приведенного примера
наследование не нужно. Действительно, то же самое можно реализовать, используя
теги подстановки ( Пользовательские тегиВ нашем примере на странице статьи блога есть 7 блоков. Два из них - логотип и copyright - не нуждаются в данных. Для остальных пяти контроллеру необходимо предоставить шаблону данные. А именно:
Блоков могло быть намного больше, но непосредственное отношение к статье имеют только заголовок и тело статьи. Зачем статье знать, какие данные нужны этим блокам, откуда и как их получить? Абсолютно незачем - это не ее задача. Django предлагает нам следующее решение этой проблемы. Для каждого из блоков мы можем написать свой тег, состоящий из мини-контроллера и шаблона. Контроллер знает, как получить данные, шаблон - как отобразить. В том месте, где нам необходим блок, мы вставляем его тег - и все! Например, можно вставить список тегов и последних статей на главную страницу. Главной странице нет необходимости что-либо знать о структуре нашего блога - только факт наличия и имена тегов, реализуемых блогом. Вот пример тега для вывода списка последних статей в блоге: # тег
@register.inclusion_tag('blog/article_recent_list.htm')
def blog_recent_articles_list():
return {
'article_list': Article.objects.filter(public=True)[:10],
}
# шаблон
«h4»Последние статьи«/h4»
«ul class="links"»
{% for article in article_list %}
«li»«a href="{% url article %}"»{{ article.title}}«/a»«/li»
{% endfor %}
«/ul»
Еще одним приемуществом такого подхода является то, что данные запрашиваются непосредственно при вставке тега. Если кэшировать несколько тегов, то будут кэшированы результаты их работы - повторно данные запрашиваться не будут! И не надо изобретать велосипеды, как тут ;) Понятно, что при аккуратном подходе то же самое можно реализовать без наследования и без пользовательских тегов - подключениями и вызовом функций. Главное приемущество Django - это стройная, логичная и стандартная сруктура решения таких проблем. Ссылки на официальную документацию:
PS: Это перепечатка с моего блога
http://dpp.su/. Кстати, там есть еще несколько Рубрика: Вебмастеру
Вышел MySQL 5.1.30, первый стабильный рели....
После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:
Подробнее... |
Рубрика: MySQL
| Добавлено: 28.11.2008
Тестирование параллельных программ.
Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.
Подробнее... |
Рубрика: Тестирование
| Добавлено: 28.11.2008
Архитектура AMD64 (EM64T).
Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.
Подробнее... |
Рубрика: Архитектура AMD
| Добавлено: 27.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|