Найти - Пользователи
Полная версия: Идея шаблонизатора
Начало » Python проекты » Идея шаблонизатора
1
zheromo
Захотелось написать новый шаблонизатор
Такого нигде не видел - так что это будет по крайней мере уникальный велосипед

Основная киллфича - это множественное наследование

Для ясности картины приведу пару примеров на псевдокоде

layout.html

{% block main %}
    {% block header %}
    {% endblock %}
    {% block content %}
    {% endblock %}
    {% block footer %}
    {% endblock %}
{% endblock %}

base.html
  {% extends "layout.html" %}
  {% block content %}
          {% block menu %}
          {% endblock %}
          {% for item in object_list if not item.draft %}
                  {% block item %}
                       {{ item }}
                  {% endblock %}
          {% endfor %}
  {% endblock %}

menu.html
     {% block menu %}
         menu ...
     {% endblock %}

footer.html
     {% block footer %}
         menu ...
     {% endblock %}

list.html
{% extends "menu.html" "footer.html" "base.html" %}
{% block item %}
     <strong>{{ super() }}</strong>
{% endblock %}
JOHN_16
а вы точно понимаете разницу между extends и include ?
zheromo
JOHN_16
а вы точно понимаете разницу между extends и include ?
Есть повод сомневаться?
JOHN_16
хм, было бы неплохо если бы вы объяснили ваше понимание того как это будет работать, подробно.

Я 20 раз думал и выдвигаю свой третий вариант видения. Запись
{% extends "menu.html" "footer.html" "base.html" %}
означает что шаблонизатор должен из списка шаблонов выбрать все кроме последнего, обработать их и передать полученные наборы блоков в последний шаблон? (ибо в первые два содержат только блоки,а не инструкции куда их отправлять)
zheromo
JOHN_16
означает что шаблонизатор должен из списка шаблонов выбрать все кроме последнего, обработать их и передать полученные наборы блоков в последний шаблон? (ибо в первые два содержат только блоки,а не инструкции куда их отправлять)

Совершенно верно
Рендеринг будет осуществляться начиная с блока main
Соответсвенно блоки подставялются аналогично MRO Питона, в супер можно ввести параметр имени блока, также аналогично super Питона.
JOHN_16
хм.. гляньте на Mako шаблонизатор, там, возможно, есть такое, но в несколько другом виде.

Ну а вообще идея имеет право на жизнь, на счет “киллфичи” не уверен.

Попробуйте высказать это разработчикам Джанги, может им это идея понравится и они реализуют это. Потому как пока что это запись эквивалентна не слишком длинному варианту:
{% extends  "base.html" %}
{% include "menu.html" %}
{% include "footer.html" %}
{% block item %}
     <strong>{{ super() }}</strong>
{% endblock %}
FishHook
<strong>{{ super() }}</strong>
Если бы в шаблонах Джанги можно было вызывать функции!
JOHN_16
FishHook
Это противоречит философии MVC, в частности “отделение представлений от базовой логики” …как бы так наверное
FishHook
JOHN_16
FishHookЭто противоречит философии MVC, в частности “отделение представлений от базовой логики” …как бы так наверное
Как бы хороша не была философия MVC, она так и остается философией. Стопроцентной реализации ее я лично не встречал.
И если философия противоречит здравому смыслу, то ну ее нафиг такую философию.
{{ "point"|str_add:forloop.counter|str_add:'_9'|get_field:form }}
Может быть эта конструкция очень фисософна, но я бы предпочел сделать так
{{ form["point"+forloop.counter+'_9'] }}
lorien
Обе контсрукции одинаково содержат код, если уж мы говорим о философии джанги, то в данном случае надо сделать custom template tag.
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