Ok, so this is my setup: I have article() function inside default controller, which obtains article title in request.args, puts ('articles/'+str(request.args[0]) +'.html') into returned dict(article=...), and serves appropriate article's HTML from article.html with
<!-- various common tags along with <body> above and </html> below... --> <article> {{include article}}<!-- includes the right article/with-some- title.html --> </article> <!-- ... --> For example, if I access http://domain/article/with-some-title, it renders views/articles/with-some-title.html. I like that. :-) But then I have /about URL, which calls about() function inside default controller, but which I would like to use the same article template from article.html, i.e. to follow DRY. So I have tried to put my content in about.html in a variable {{article_content = MARKMIN('About us...')}} and then {{include}} modified article.html <article> {{if article_content:}}{{=article_content}}{{pass}}{{else}}{{include article}}{{pass}} </article> (Besides {{if article_content:}} I tried with try-except too. Neither worked.) When accessing /about, the ticket told me the error was in undefined 'article' variable in the include expression. So I tried it another way, by defining block with default content in article.html {{block article_content}}{{include article}}{{end}} and extending article.html in about.html {{extend 'article.html'}}{{block article_content}}{{=MARKMIN('About us...')}}{{end}} As per documentation, default value inside {{block}} (in my case '{{include article}}') should be replaced with specified value (in my case {{=MARKMIN(...)}}). But again, the ticket reports the same error: ... File "/home/****/web2py/gluon/template.py", line 449, in include text = self._get_file_text(filename) File "/home/****/web2py/gluon/template.py", line 430, in _get_file_text filename = eval(filename, self.context) File "<string>", line 1, in <module> NameError: name 'article' is not defined To avoid using {{include}}, the next thing I am about to try is: {{block article_contents}}{{if article:}}{{=open(article).read()}} {{pass}}{{end}} but this way I have to maintain os.getcwd() and annote the article with proper path to my views. I don't know how stable this is. Inexperienced as I am, I'm assuming it's possible I'm doing something horribly wrong. What is that? :-) TL;DR: The templating system counter-intuitively gives unconditional priority to {{include}} expressions, which it evaluates first. Oh, and if you can please tell me how I can make the about() function to use the article.html view instead of default about.html view, that would solve my DRY problem as well, I suppose. :-) Thanks!