Ok, will try a more concrete example, and I'll start by showing what I used
to have :
In *MODELS/MODELS.PY *:
db.define_table('modelA ',
Field('modelA_field1','string),
Field('modelA_field2','string),
)
db.define_table('modelB ',
Field('modelB_field1','string),
Field('modelB_field2','string),
)
In *CONTROLLERS/DEFAULT.PY* :
def modelA_read():
# I do all work here, in regard to generate forms, pagination,
etc...
return dict(read_form_for_modelA)
def modelB_read():
# Do all work here, in regard to generate forms, pagination,
etc...
return dict(read_form_for_modelB)
def modelA_edit():
# Do all work here, in regard to generate forms, etc...
return dict(edit_form_for_modelA)
def modelB_edit():
# Do all work here, in regard to generate forms, etc...
return dict(edit_form_for_modelB)
In *VIEWS/DEFAULT/MODELA_READ.HTML*.
>
> {{extend 'layout.html'}}
> <!-- I do all representation of read form for ModelA-->
In *VIEWS/DEFAULT/MODELB_READ.HTML*.
>
> {{extend 'layout.html'}}
> <!-- I do all representation of read form for ModelB-->
In *VIEWS/DEFAULT/MODELA_EDIT.HTML*.
>
> {{extend 'layout.html'}}
> <!-- I do all representation of edit form for ModelA-->
In *VIEWS/DEFAULT/MODELB_EDIT.HTML*.
>
> {{extend 'layout.html'}}
> <!-- I do all representation of edit form for ModelB-->
Most of the work done inside the controllers (modelA_read/modelB_read and
modelA_edit/modelB_edit), and inside the views
(modelA_read.html/modelB_read.html and modelA_edit.html/modelB_edit.html),
was basically the same.
So now I have :
In *MODELS/MODELS.PY *(Nothing changed here) :
db.define_table('modelA ',
Field('modelA_field1','string),
Field('modelA_field2','string),
)
db.define_table('modelB ',
Field('modelB_field1','string),
Field('modelB_field2','string),
)
In *MODELS/GENERIC.PY* :
def generic_read():
# Do all work here, get mydata, generate forms, pagination,
etc...
return dict(read_form_for_whatever_model)
def generic_edit():
# Do all work here, get mydata, generate forms, pagination,
etc...
return dict(edit_form_for_whatever_model)
In *CONTROLLERS/DEFAULT.PY* :
def modelA_read():
# I do nothing here
return generic_read()
def modelB_read():
# I do nothing here
return generic_read()
def modelA_edit():
# I do nothing here
return generic_edit()
def modelB_edit():
# I do nothing here
return generic_edit()
In *VIEWS/DEFAULT/MODELA_READ.HTML*.
>
> {{extend 'generic_read.html'}} # I do nothing else here either
In *VIEWS/DEFAULT/MODELB_READ.HTML*.
>
> {{extend 'generic_read.html'}} # I do nothing else here either
In *VIEWS/DEFAULT/MODELA_EDIT.HTML*.
>
> {{extend 'generic_edit.html'}} # I do nothing else here either
In *VIEWS/DEFAULT/MODELB_EDIT.HTML*.
>
> {{extend 'generic_edit.html'}} # I do nothing else here either
In *VIEWS/GENERIC_READ.HTML*
> {{extend 'layout.html'}}
> {{include}}
> <!-- Do all representation of my read form, for whatever model -->
>
In *VIEWS/GENERIC_EDIT.HTML*
> {{extend 'layout.html'}}
> {{include}}
> <!-- Do all representation of my edit form, for whatever model -->
So, my question was about how to get rid of these lines on DEFAULT.PY :
def modelfoo_read():
# I do nothing here
return generic_read()
... and also avoid having to create views for each of those controllers,
where I only have one line of code :
{{extend 'generic_read.html'}}
I'm trying your solution with response.view, and it seems ok so far, but
I'll give you final feedback...
On Monday, October 15, 2012 3:33:14 PM UTC+1, apinho wrote:
>
> Hi,
>
> I started with web2py a few weeks ago, writing some very simple apps. I
> noticed that I was constantly repeating myself in the following steps :
> Write a controller to fetch the data
> Write a view to present data.
>
> So, I made generic controllers and views, which I later call using this
> schema :
>
> User request : http://myserver/myapp/mymodel_list
>
> In CONTROLLERS/DEFAULT.PY :
> def mymodel_list():
> return generic_list()
>
> In MODELS/GENERIC.PY :
> def generic_list():
> # Do all work here, get mydata, pagination, etc...
> return dict(mydata)
>
> In VIEWS/DEFAULT/MYMODEL_LIST.HTML :
> {{extend 'generic_list.html'}}
>
> In VIEWS/GENERIC_LIST.HTML
> {{extend 'layout.html'}}
> {{include}}
> <!-- Do all representation of mydata -->
>
> This works well for me, cause I only have to deal with 4/5 controller and
> views (generic_list, generic_read, generic_add, generic_edit).
>
> One question though :
> For every model I have to create all the functions :
> def mymodel_read():
> return generic_read()
> def mymodel_list():
> return generic_list()
> etc...
> .. and I also have to create all the views :
> mymodel_list.html :
> {{extend 'generic_list'}}
> mymodel_list.read :
> {{extend 'generic_read'}}
> ...etc
>
> I believe there must be a way to avoid creating these views and these
> controllers, through the use of routes, or something.
>
> Someone care to guide me to do this ?
>
>
>
>
>
>
--