унаследованные переменные python во вложенных шаблонах торнадо - PullRequest
0 голосов
/ 12 сентября 2011

Я пытаюсь вложить шаблоны торнадо, используя {% include%}:

<html>
    {% for headline in HL['headlines'] %} 
        {% include 'hl_1.html' %}
    {% end %}
    </ul>
  </body>
</html>

Приведенный выше шаблон работает, а подшаблон выше.То, что я не могу понять, как это сделать, это передать имя суб-шаблона (например, заменить 'hl_1.html' на строковый параметр в пространстве имен родительского шаблона).После просмотра исходного кода template.py кажется, что {% include принимает строку и ничего больше.Но было бы здорово, если бы кто-то мог динамически указывать под-шаблоны.

Кто-нибудь пробовал это и преуспел?

спасибо

1 Ответ

2 голосов
/ 06 декабря 2011

Обычно это достигается с помощью модулей пользовательского интерфейса .

Так я бы структурировал ваше приложение.

Первый main.py:

import tornado.ioloop                                           
import tornado.web 
import views

class MainHandler(tornado.web.RequestHandler):                  
    def get(self):                                              
        HL = {                                                  
                'headlines': ['head1', 'head2', 'head3'],
                }
        self.render('tmpl.html', HL=HL)

if __name__ == "__main__":
    application = tornado.web.Application([
        (r"/", MainHandler),
    ], ui_modules=views)
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Тогда ваш шаблон tmpl.html:

<html>
    {% for headline in HL['headlines'] %} 
        {% module Headline(headline) %}
    {% end %}
    </ul>
  </body>
</html>

Наконец, views.py, где вы можете определить все свои модули пользовательского интерфейса:

from tornado.web import UIModule

class Headline(UIModule):
    def render(self, name):
        return '<h1>%s</h1>' % name

UI modules подобны «шаблонам многократного использования», которые принимают параметры.

...