Как стать автором
Обновить
0

Как собирается сайт

Время на прочтение6 мин
Количество просмотров5.8K
В прошлом посте мы рассказали о нашем новом конструкторе сайтов.
На этот раз хотелось бы более подробно рассказать о том как работает шаблонная система. Она полностью джанговская, но то, как она построена заслуживает отдельного упоминания. К тому же, это будет полезно для тех читателей, кто не знаком с шаблонизатором от Django.


Принцип гибкости


Каким же образом достигается гибкость в конструкторе Бигго. Рассмотрим на примере.
Каждый контентный объект имеет свой URL, при запросе которого, система показывает нужное содержимое. Кроме URL, задаются еще и 2 типа шаблонов: внешние и модульные. Пример внешнего шаблона:

articles.html:
{% extends "base.html" %}
      
      {% block title %}{% if title %}{{ title }}{% else %}{{ block.super }}{% endif %}{% endblock %}
      
      {% block content %}
      <div id="content" class="box">
          
          <div class="content-block box">
            {% BreadCrumbs %}
          </div>
          {% Articles %} {% CommentsAddForm www2 %}{% Comments www2 %}{% TagsCloud %}
        </div>
      {% endblock %}
      


* This source code was highlighted with Source Code Highlighter.


Как видно, он наследует base.html, и переопределяет его блоки title и content.
Сам base.html может выглядеть примерно так:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="/css/style.css" type="text/css" media="screen">

<title>{% block title %} {% SiteCaption %} {% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>


* This source code was highlighted with Source Code Highlighter.


Обратите внимание на вызываемы Django-теги {% Articles %}, {% CommentsAddForm www2 %}, {% Comments www2 %}, {% TagsCloud %}. Они представляют собой содержимое модулей статей, комментариев и облака меток. В том месте, где вызывается тег, он выводит HTML-содержимое, которое генерируется по заданному модульному шаблону.
Рассмотрим один из таких на примере статей:

    <div class="content-block box">
            
            <h3><span>{{ base_obj }}</span></h3>
            {{ base_obj.details }}
            
            {% for obj in lst %}
            <dl class="article box">
              {% if obj.get_image and obj.settings.show_image_on_page %}<dd class="fl">
                <img src="{{ obj|make_thumbnail }}" alt="alt"></dd>{% endif %}
              <dd class="dt box">
                <strong class="font19"><a href="{{ obj.get_absolute_url }}">{{ obj }}</a></strong>
                <div class="font13">{{ obj.p_details }}{{ obj|obj_info:"html"|truncatewords:"20"}}
<br/><a href="{{ obj|obj_info:"source_url" }}">{{ obj|obj_info:"source" }}</a>
</div>
                <dl class="artinfo box font13">
                  <dd class="fl">
                    {% if obj.p_dateadd %}Опубликовано <b>{{ obj.p_dateadd }} </b>{% endif %}
                    
                  </dd>
                  <dd class="fr">
                    {{ obj|obj_info:"author" }}
                    
                  </dd>
                  <dd class="fr tags">
                  {% TagsBind obj.get_absolute_url %}
                  </dd>
                </dl>
              </dd>
            </dl>
            {% endfor %}
            {% pagination %}
            
            
          </div>


* This source code was highlighted with Source Code Highlighter.


Этот шаблон задает отображение вызываемого тега {% Articles %}. Обратите внимание, что внутри есть вызовы еще двух inclusion тегов: {% pagination %} и {% TagsBind %}

Рекурсивный вызов



Некоторые теги, для реализации неограниченной вложенности вызывают сами себя. Пример:

  <ul class="menu">
  {% for part in parts %}
    
    <li><a href="{{ part.get_url }}" onmouseover="{{ part.on_mouseover }}">{{ part }}</a>
    {% for menu_obj in part.menu_set.all %}
      
      {% Menu menu_obj.eng_word %}
  
    
    {% endfor %}  
    </li>
  {% endfor %}
  </ul>


* This source code was highlighted with Source Code Highlighter.


{% Menu menu_obj.eng_word %} — вызывает вложенное меню с соответствующим именем

Подробнее о наследовании шаблонов


Страница base.html(базовый шаблон, родительский):
image

Дочерний шаблон:
image

URL-зависимость тега


Один и тот же тег(например {% Articles %}) может выводить разное содержимое в зависимости от URL. Это хорошо видно на картинке:
image

P.S. Мы учли замечания хабровчан: добавили портфолио, сделали акцент на привязку своего домена и другие мелочи.
Теги:
Хабы:
Всего голосов 26: ↑15 и ↓11+4
Комментарии10

Публикации

Информация

Сайт
cms.biggo.ru
Дата регистрации
Дата основания
2008
Численность
2–10 человек
Местоположение
Россия

Истории