On Wednesday, August 8, 2012 7:09:37 AM UTC-4, Jim Gregory wrote:
>
> Can custom_store and custom_retrieve take parameters when they are called 
> using Field, e.g.:
> db.define_table('table',
>     Field('file', 'upload', custom_store=store_file(file, 
> db.table.new_filename), 
> custom_retrieve=retrieve_file(db.table.new_filename))?
>     Field('new_filename','string')
> )
>

These attributes have to be callables, so you can't call them yourself. To 
pass additional custom arguments to a callable, just turn it into a lambda 
that takes the standard arguments and pass the additional arguments to your 
function within the lambda:

Field('file', 'upload',
    custom_store=lambda file, filename, path: store_file(file, filename,path
, db.table.new_filename),
    ...)

When web2py calls the custom_store callable, it will pass three arguments 
(file, filename, and path), so your lambda must take three arguments. 
Within the lambda, you can then do whatever you want. You can pass any or 
all of the standard three arguments to your custom function, and you can 
pass additional arguments. In the example above, I passed the three 
standard arguments followed by a fourth custom argument, though it doesn't 
have to look like that (presumably you will at least want to pass the file 
as an argument).

custom_retrieve takes two standard arguments, "name" and "path".

Anthony

-- 



Reply via email to