10 апр. 2010 г.

Хитрое наследование в шаблонах django

В одном из постов увидел пример “техники”, который раньше использовал в проекте с большим кол-вом приложении и шаблонов. Суть в использовании “прокси-шаблонов” между базовым и конченым шаблонами.

Например, для следующей структуры приложении

  • apps
    • common
    • blogs
    • news
    • etc…

Подготовлена следующая структура шаблонов:

  • templates
    • base.html (страница с разметкой на блоки, в блоках default контент)
    • index.html (сетка главной)
    • page.html (для страниц с placeholder’ами для django-cms)
    • news
      • news_base.html (прокси шаблон для новостей с названием раздела, например; наследуется от base.html)
      • news_list.html (наследуется от news_base.html)
      • new_detail.html (наследуется от news_base.html)
      • etc…
    • blogs
      • blogs_base.html (-||-||-)
      • blog_post.html (-||-||-)
      • etc…

Под наследованием шаблонов, естественно, понимается использование инструкции {% extends %}. Такие конструкции могут быть весьма полезны при использовании “местных” библиотек и стилей в разделе, приложении для публикации баннеров с делением по разделам и пр.

Например использование “местных” библиотек и стилей можно реализовать следующим образом:


<!-- base.html -->

{% spaceless %}{% load i18n %}<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

    <head>

        <title>{% block title %}{% trans 'Мой супер сайт' %}{% endblock %}</title>

        <link href="{{ MEDIA_URL }}styles.css" rel="stylesheet" type="text/css">

        <!--[if IE 6]>

        <style>

        .my-div {width: 100px;}

        </style>

        <![EndIf]-->


        {% block extrahead %}

        <link rel="icon" href="{{ MEDIA_URL}}bitmaps/favicon.ico" type="image/x-icon">

        <link rel="shortcut icon" href="{{ MEDIA_URL}}bitmaps/favicon.ico" type="image/x-icon">

        {% endblock %}

    </head>

<body>



<!-- base_news.html -->

{% extends 'base.html' %}

{% block extrahead %}

        <script type="text/javascript" src="{{ MEDIA_URL }}tinymce/jscripts/tiny_mce/tiny_mce.js"></script>

        <link href="{{ SITE_MEDIA_URL }}menu.css" rel="stylesheet" type="text/css">

        <link rel="icon" href="{{ MEDIA_URL}}bitmaps/news_favicon.ico" type="image/x-icon">

        <link rel="shortcut icon" href="{{ MEDIA_URL}}bitmaps/news_favicon.ico" type="image/x-icon">

{% endblock extrahead %}


Однако я так уже давно не пишу – стараюсь использовать django-compress везде, где только можно.

Для добавления дополнительных скриптов и стилей в наследниках base_news.html можно использовать инструкцию {{ block.super }} внутри блока extrahead.

А Вы используете такие фишечки в своих джанго проектах?

5 комментариев:

Qrilka комментирует...

Т.е. описываешь, то что сам не используешь?
Несколько странновато :)

Ivan Markeev комментирует...

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

Qrilka комментирует...

Понять бы ещё что там будет #1
Нормальную вставку листингов не хотел сделать случаем?

Ivan Markeev комментирует...

Я уже писал об использовании compress'а. Разница будет, как раз, в способе добавления стилей и скриптов на страницу. Т.е. вместо script и style/link тэгов будут тэмплейт-тэги compress'а, для каждой страницы свои группы (в которых будут объединенные и сжатые по всем правилам скрипты и стили).

Анонимный комментирует...

если честно, не очень понял, где тут "хитрое использование". по-моему это обычная практика построения иерархии шаблонов. на среднем сайте вложенность получается около трех.
и не увидел противоречия с django-compress, буду теперь на продакшне использовать)