Thanks, Anthony. So to sum up what I think the options are: 1) The code laying out the standard SQLFORM.grid record view handles the display of each field and - for upload fields - the download link uses:
https://.../controller/sqlform_grid_function/download/file_name That can be changed using the upload argument to SQLFORM grid. If you pass in a string (like the output of URL) then file name value is appended, so: form = SQLFORM.grid(..., upload = URL('dataset', 'download_dataset'), ...) will set the download link to: https://.../dataset/download_dataset/file_name You can pass in a function instead, in which case the output of the function is used as the link (*without* appending the file name value). So if you do: form = SQLFORM.grid(..., upload = lambda value: URL('datasets', 'download_dataset'), ...) then the link is not terribly functional: https://.../dataset/download_dataset The only local variable that function has access to is the file name, so this bit of code provides a function that duplicates just providing the URL as a string: form = SQLFORM.grid(..., upload = lambda value: URL('datasets', 'download_dataset', value), ...) That isn't particularly useful, but the value could be used in a more complex way. For example, as Anthony says, by looking up the filename (which will be unique, thanks to the random component of the internal file names) in the database table and using this to populate a link with the custom download information. For example, this function allows the URL to be expanded to use other parts of the record for that file: def _lookup(value): record = db(db.datasets.file == value).select().first() return URL('datasets','download_dataset', args=[record.dataset_id, record.file]) form = SQLFORM.grid(..., upload = lambda value: _lookup(value), ...) That produces links like this (for a record with dataset_id = 15): https://.../datasets/download_dataset/15/file_name I don't think there is any way to get the default download controller to know about the nested download - it uses the field.retrieve method to get the data and that doesn't know about the record specific upload folder. So, I think you *have to* then use a custom function to provide the download. Another alternative is to change the representation of the file field in the controller function before creating the SQLFORM.grid. For example: db.datasets.file.represent = lambda value, row: A('Download file', _href=URL ('datasets', 'download_dataset', vars={'id': row.id})) I thought that would derail the upload widget in the SQLFORM edit view but it doesn't seem to. Its probably a simpler way to get a custom download link that points to the record rather than just the filename, but doesn't get around the need for a custom download function. On Saturday, 3 February 2018 17:37:32 UTC, Anthony wrote: > > On Saturday, February 3, 2018 at 1:58:26 AM UTC-5, David Orme wrote: >> >> So at the moment, what users are seeing is a controller presenting >> SQLFORM.grid of dataset records, and then in the 'view' argument to that >> controller for a particular record, the file field is shown as the output >> of the represent method of UploadWidget (so the word 'file' wrapped up >> with the download link, which is ignorant of the subfolder). It isn't >> obvious to me that there is a way to insert new_ds_id into that mechanism? >> > > The "upload" argument of SQLFORM.grid can be a function that takes the > value and returns a URL, but you are still stuck having to figure out the > URL from the filename, which will require a database lookup per row of the > grid. An alternative is to not display the default file column in the grid > and instead use the "links" argument to generate a custom column with > custom download links (see "links" under > http://web2py.com/books/default/chapter/29/07/forms-and-validators#SQLFORM-grid-signature). > > Another option is to create a custom column using a virtual field. > > Anthony > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.