>
> Question 2:
> How do I selectively delete the "image" field without deleting the
> entire "test" record? In other words, I want to delete the image file
> and null-out the image field, but leave the rest of the test record
> intact.
I suppose you would have to explicitly delete the file. This is made a
little more complicated by uploadseparate=True. In that case, the file is
stored two sub-folders deep inside the field's uploadfolder -- the path to
the file is [uploadfolder]/[tablename].[fieldname]/[first 2 characters of
UUID portion of filename]. For example, the filename might be something
like test.name.9d4498f37ce2b906.746573742066696c652e6a7067.jpg (the
highlighted segment after the table and field name is the UUID fragment).
The path to that file would be
/static/data/test.name/9d/test.name.9d4498f37ce2b906.746573742066696c652e6a7067.jpg.
To delete the file associated with a particular record (warning: all code
below untested):
file_to_delete = db(db.test.id==[id to delete]).select().first().name
import os
os.remove(os.path.join(db.test.name.uploadfolder, 'test.name',
file_to_delete.split('.')[2][:2], file_to_delete))
You could also abstract this into a general function that also updates the
db record:
def delete_file(row, uploadfield):
import os
file = row[uploadfield]
table, field, subfolder = file.split('.')[0:3]
subfolder = subfolder[:2]
os.remove(os.path.join(db[table][field].uploadfolder,
'%s.%s' % (table, field), subfolder, file))
row.update_record(**{uploadfield: None})
Anthony