Как я должен делиться кодом («модулями») между моими шаблонами? - PullRequest
1 голос
/ 02 ноября 2010

Если бы на моем веб-сайте Pylons было два контроллера, которые обслуживали бы два разных файла шаблона, какой был бы лучший способ показать один и тот же фрагмент HTML на каждом шаблоне?

Например, допустим, у меня был блог. На первой странице будет показан список последних записей, и каждая запись будет иметь «постоянную ссылку», ссылающуюся на страницу, показывающую только эту запись. На каждой из этих страниц я хочу показать «последние записи» - список 5 самых последних сообщений в блоге.

Файлы шаблонов разные. Контроллеры разные. Как мне показать «модуль последних сообщений»?

Должен ли я иметь что-то вроде:

from blog.model import posts

class BlogController(BaseController):

    def index(self):
        c.latestPosts = posts.get_latest()

        return render('home.html')

class OtherController(BaseController):

    def index(self):
        c.latestPosts = posts.get_latest()

        return render('otherpage.html')

c.latestPosts будет тогда списком ссылок, которые отображает шаблон. Проблема, с которой я сталкиваюсь, заключается в том, что я должен отобразить HTML для этого в двух отдельных файлах шаблона. Если я хочу изменить HTML, это значит изменить его в двух местах ...

Я пытаюсь найти изящный способ сделать это, но у меня заканчиваются идеи. Как бы вы это сделали?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

Возможность совместного использования общих фрагментов HTML, таких как верхние и нижние колонтитулы, область входа в систему, боковые панели и т. Д., Является очень распространенным требованием. Шаблонные движки обычно предоставляют средства для этого.

Если вы используете Мако, вот два основных механизма, которые вы можете использовать:

Включает

Проверьте тег <% include> . В вашем шаблоне страницы вы указываете, где будут размещаться различные биты многократного использования. Вы как бы создаете страницу с нуля, собираете ее из имеющихся у вас повторно используемых компонентов.

Пример из документации Мако:

<%include file="header.html"/>

    hello world

<%include file="footer.html"/>

Наследование

Проверьте тег <% наследовать> . Это работает аналогично наследованию в языках программирования, таких как Python. В базовом шаблоне вы настраиваете каркас страницы. В шаблонах страниц вы настраиваете и расширяете некоторые части базового шаблона.

Быстрый пример, base.mako:

<html>
<head></head> 
<body>
    ${self.header()}

    ${self.body()}

</body>
</html>

<%def name="header()">

This is the common header all pages will get unless 
they override this.

</%def>

А somepage.mako:

<%inherit file="/base.mako"/>

This content will go into body of base.

Движки шаблонов обычно имеют множество отличных функций, и я призываю вас лучше узнать их!

0 голосов
/ 03 ноября 2010

Хотя ответ Петериса хороший, вам также может потребоваться функциональность Мако <% namespace> , которая тесно связана с оператором import в необработанном Python.

Однако <% наследовать> и <% включать> - это то, что вы должны регулярно использовать.

...