Version 13 (modified by Fran Boon, 16 years ago) ( diff )




This is an MVC environment (like Rails).


Defines databases in: /models/ (equivalent of inst/mysql-dbcreate.sql)

The Models are loaded 1st within Web2Py processing, before the controllers. So you can import any global modules/set any global variables here. The Models are imported in alphabetical order, so we load the files which other modules depend on 1st, hence naming them,


Python functions in /controllers/


   def list_records():
       return dict (list=list)


HTML/Javascript templates in /views/module/function.html

  • these are normal HTML/JS files with the ability to add in Python code (e.g. variables) surrounded by brackets: {{ interpreted python here }}
  • there should be an .html file available for each function in the module (name normally being the same as the function)
  • these normally inherit from views/layout.html which also includes the Javascript from views/web2py_ajax_t2.html
  • if there is no view defined then a default view will be displayed, which will show the values of all the data it can see, but not be formatted nicely

CSS/Javascript files are stored in /static (equivalent of www/res)


This plugin is used for AAA & simplified CRUD (inc Conflict Detection)

We extend the T2 class in modules/

Conflict Detection

Add this field to each table which needs protecting (in models/

SQLField('modified_on','datetime'), # Used by T2 to do edit conflict-detection

Sahana3 Framework

These are the bits that we use on top of Web2Py to give the Sahana look & feel:

Populate the side navigation Menus by adding this to each controller:

# Current Module (for sidebar title)
# List Modules (from which to build Menu of Modules)
# List Options (from which to build Menu for this Module)
options=db(db['%s_menu_option' % module].enabled=='Yes').select(db['%s_menu_option' % module].ALL,orderby=db['%s_menu_option' % module].priority)

Each function needs to return these values to the view:

return dict(module_name=module_name,modules=modules,options=options)

List output can be made more functional by adding this to your table definitions in models/

db.table.represent=lambda table: A(table.display_field,_href=t2.action('display_table',

Form labels can be set in a translatable manner using:


Form field can be made to use a TEXTAREA by marking the field as being type 'text':


Form field can be made to use a SELECT dropdown by setting the field as a lookup to another table:


Set this to use a different field than 'id' in the views (e.g. 'name') using:


Form field being required can be marked using:


Help for a form field can be set using:

A(SPAN("[Help]"),_class="popupLink",_id="tooltip",_title=T("Help Title|This is what this field is for."))

Options fields

Sahana2 has a generic 'field_options' table for storing Options fields.

Sahana3 uses a separate table for each lookup list.

How to add a new Module?



Note: See TracWiki for help on using the wiki.