Por padrao, quando se cria uma nova aplicacao, o web2py faz um clone da aplicacao "welcome". Logicamente esta nova aplicacao herda todas as caracteristicas da app "welcome", incluindo o menu.When you create a new application using admin, it starts as a clone of the "welcome" scaffolding app with a "models/db.py" that creates a SQLite database, connects to it, instantiates Auth, Crud, and Service, and configures them. It also provides a "controller/default.py" which exposes actions "index", "download", "user" for user management, and "call" for services. In the following, we assume that these files have been removed; we will be creating apps from scratch.Abaixo esta um exemplo de uma estrutura de menu para uma aplicacao de catalogacao de discografia de bandas, contendo apenas dois itens de menu, "cadastros" e "ajuda", sendo que o menu "cadastros" possui o submenu "banda" e "discografia" e o menu "ajuda" possui o submenu "sobre o sistema".# Editar a "def _():" do arquivo "sua_app/models/menu.py" conforme abaixo:def _(): # shortcuts app = request.application ctr = request.controller # useful links to internal and external resources response.menu += [ (SPAN('Cadastros', _class='highlighted'), False, '#', [(T('Bandas'), False, URL('bandas')), (T('Discografia'), False, URL('discografia'))] ), (SPAN('Ajuda', _class='highlighted'), False, '#', [(T('Sobre o sistema'), False, URL('sobre'))] ), ] Estetipo de filtro e bem bacana para aquelas situacoes em que se temuma tabela HTML povoada e precisa-se encontrar determinado registrorapidamente. A figura 1 ilustra o funcionamento. A ideia e basicamente: a medida em que o usuario digita o termo da consulta, a tabela html e automaticamente filtrada, mostrando apenas as linhas <tr> que contem o termo da pesquisa.Figura1. Visao do exemplo rodando.Aestrutura de arquivos deste exemplo e a seguinte:estilos.cssfiltro.js (exemplos catados da net)jquery.js(e o jquery padrao, se tiver desenvolvendo em web2py ele esta emstatic/js)index.htmlestilos.css ------------------------------------------------------h1 {font-size:1.50em}body { background-color: #fff; font-family: arial; font-size: 14px;}.tabela { margin:0px; padding:0px; width:100%; box-shadow: 5px 5px 5px #888888; border:1px solid #b2b2b2; }.tabela_topo{ background-color:#0084c6; border:1px solid #b2b2b2; border-width:0px 0px 1px 1px; text-align:center; font-size:14px; font-family:Arial; font-weight:bold; color:#ffffff; }filtro.js ------------------------------------------------------/*Efeito zebra na tabela*/var oldColor = '#fff';jQuery(document).ready(function() { $('.zebra:even').css('background-color', '#E9E9E9');//faz o efeito da zebra nas linhas /*efeito hover ao passar pela linha*/ $('.zebra').hover(function(){ oldColor = $(this).css('background-color'); $(this).attr('oldColor',oldColor); //Atributo para funcionar em todos os navegadores $(this).css('background-color', '#81b9da'); //seta a cor do mouseover da linha },function(){ $(this).css('background-color', $(this).attr('oldColor')); //restaura cor original na saida do evento });});/*Filtro*/$(function(){ $(".input-search").keyup(function(){ //pega o css da tabela em que sera feito o filtro var tabela = $(this).attr('alt'); if( $(this).val() != ""){ $("."+tabela+" tbody>tr").hide(); $("."+tabela+" td:contains-ci('" + $(this).val() + "')").parent("tr").show(); } else{ $("."+tabela+" tbody>tr").show(); } }); });$.extend($.expr[":"], { "contains-ci": function(elem, i, match, array) { return (elem.textContent || elem.innerText || $(elem).text() || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0; }});index.html ------------------------------------------------------<!DOCTYPE html><head> <meta charset="utf-8" /> <link href="estilos.css" rel="stylesheet" type="text/css" /> <script src="jquery.js"></script> <script src="filtro.js"></script></head><body> <table width="100%"> <tr> <td><h1>Contatos</h4></td> <td><div align='right'><input type="text" class="input-search" alt="tabela" placeholder="Buscar nesta lista" /></div></td> </tr> </table> <table class="tabela"> <thead> <tr class="tabela_topo"> <td><b>Nome</b></td> <td><b>Fone</b></td> <td><b>E-mail</b></td> </tr> </thead> <tbody> <tr class="zebra"> <td>Joao da Silva</td> <td>9900-1122</td> <td>joao@dasilva.com</td> </tr> <tr class="zebra"> <td>Maria da Costa</td> <td>9911-2233</td> <td>maria@dacosta.com</td> </tr> <tr class="zebra"> <td>Pedro dos Santos</td> <td>9922-3344</td> <td>pedro@dossantos.com</td> </tr> <tr class="zebra"> <td>Jose Paulo</td> <td>9933-4455</td> <td>jose@paulo.com</td> </tr> </tbody> </table></body> Em determinado momento precisei criar uma rotina para zerar