Hello pbreit,
I cannot find the post on this group where I found it but I'm pretty
sure form.vars.filename_newfilename is what you're looking for.
This is not to be confused with request.vars.filename.filename which
will contain your original filename. form.vars.filename_filename will
contain the new filename returned by store()
Rather than using two tables from models I am defining my Fields
directly in my SQLFORM.factory but that shouldn't matter in this case.
I have successfully uploaded files to the filesystem having
SQLFORM.factory calling store() and renaming the file for me.
I had to specify an uploadfolder similar to
uploadfolder=os.path.join(request.folder,'static/uploads/') in my
SQLFORM.factory. (Just realized that's what you helped me with a few
days ago.)
Try this in your db.image.insert(...):
def newpost():
form = SQLFORM.factory(db.post, db.image)
if form.process().accepted:
post_id = db.post.insert(**db.post._filter_fields(form.vars))
db.image.insert(post_id=post_id,
filename=form.vars.filename_newfilename)
redirect(URL('post', args=post_id))
return dict(form=form)
-David
On Oct 2, 4:23 am, pbreit <[email protected]> wrote:
> I can't seem to figure out how to do multiple tables in one form where an
> image upload is involved. I've tried various combinations of this.
> Unfortunately I'm not getting meaningful error messages right now,
> everything is listed as "timed out".
>
> db.define_table('post',
> Field('title'),
> Field('body', 'text'))
>
> db.define_table('image',
> Field('post_id', db.post, readable=False, writable=False),
> Field('filename', 'upload'))
>
> def newpost():
> form = SQLFORM.factory(db.post, db.image)
> if form.process().accepted:
> post_id = db.post.insert(**db.post._filter_fields(form.vars))
> db.image.insert(post_id=post_id,
> filename=db.image.filename.store(form.vars.filename.file,
> form.vars.filename.filename))
> redirect(URL('post', args=post_id))
> return dict(form=form)