É comum precisarmos manter uma parte do layout estática enquanto outras partes se alteram. Por isso, às vezes vamos precisar herdar um layout de outras views. Por exemplo, o layout padrão do web2py e das views genéricas é o layout.html, dentro da pasta views, e é herdado pelas views genéricas da seguinte maneira:
{{extend 'layout.html'}}
Novo código aqui, que vai aparecer utilizando o layout da view layout.html
A partir da declaração extend, informamos que nossa view deve ser incorporada pela view layout.html. Ela deve estar sempre no início do arquivo.
Caso você confira o código da view layout.html, vai encontrar lá uma declaração {{include}}. Essa declaração serve para informar o local onde deve ser incorporada toda view que herdar desse layout. Portanto, nossa view vai aparecer onde se encontra o include.
Às vezes precisamos de informações que sejam padrões para todas as views, mas que sejam diferentes para uma específica. Por isso, devemos separar nossos blocos de conteúdo mutáveis.
Considere esse como sendo o layout.html:
<html>
<body>
{{include}}
<div class="sidebar">
{{block meubloco}}
Minha sidebar padrão.
{{end}}
</div>
</body>
Temos a seguinte view que herda dele:
{{extend 'layout.html'}}
Texto aleatório que poderia ser um lorem ipsum mas não é.
{{block meubloco}}
Minha nova sidebar.
{{end}}
Dessa forma, o conteúdo do block meubloco será inserido em sua área específica, sobrepondo a informação anterior, enquanto o restante será inserido no local do include. Assim:
<html>
<body>
Texto aleatório que poderia ser um lorem ipsum mas não é.
<div class="sidebar">
Minha nova sidebar.
</div>
</body>
</html>
Já em outras ocasiões, queremos apenas adicionar conteúdo a um local específico. Por isso, utilizamos a declaração super para manter o conteúdo original. Utilizando o exemplo acima, teremos na view que herda layout.html:
{{extend 'layout.html'}}
Texto aleatório que poderia ser um lorem ipsum mas não é.
{{block meubloco}}
{{super}}
Minha nova sidebar.
{{end}}
E como resultado:
<html>
<body>
Texto aleatório que poderia ser um lorem ipsum mas não é.
<div class="sidebar">
Minha sidebar padrão.
Minha nova sidebar.
</div>
</body>
</html>