SQLFORM.FACTORY editing a document. Save reports no upload files

117 views
Skip to first unread message

António Ramos

unread,
Apr 2, 2013, 1:19:12 PM4/2/13
to web...@googlegroups.com
Back to business after almost 2 months i try again to use sqlform.factory to create and edit documents
My problem was to generate the link
i rearranged my code as follows


#if edit a document
 if request.args(0):

        row=db((db.trabalhador.id==request.args(0))).select().first()
        
        empresa=row.empresa
        
        foto=row['foto'] or None
        #print foto
        if row:
            for field in row:

                if field in db.trabalhador.fields:
                   #POPULATE FIELDS with record to edit
                    db.trabalhador[field].default=row[field]

    form=SQLFORM.factory(db.trabalhador,db.t_docs,
        submit_button="Gravar",
        fields=['nome','bi','ncart','ncartval','rfid','apt_medica','apt_medicaval','val_formacao','f_doc'],
        table_name='trabalhador',
        upload=URL('download')
        )    

I see my record and upload fields with [file] link. The [file] link downloads my uploaded file.
My upload fields have required= true in db.py!!!
I do nothing and just press save

I get the error   saying that i have to select a file to my upload field.

I´m stuck

Help please.....

António Ramos

unread,
Apr 3, 2013, 12:22:59 PM4/3/13
to web...@googlegroups.com
No ideas?


2013/4/2 António Ramos <ramst...@gmail.com>

Massimo Di Pierro

unread,
Apr 6, 2013, 12:22:32 PM4/6/13
to web...@googlegroups.com
what are the models?

Kenwyn Pilgrim

unread,
Nov 21, 2016, 10:42:54 AM11/21/16
to web2py-users
I too have this issue with using SQLFORM.factory to edit.

My model looks like:

db.define_table('upload_file',
                Field('doc_type', 'reference document_type', required=True, label=T('Type')),
                Field('pdf_name', 'upload', label=T('PDF Document'),
                      uploadfolder=os.path.join(request.folder, 'uploads', 'user_data')),...)

my controller looks like:
...

edit_mode = len(request.args) > 0
if edit_mode:
    id = int(request.args[0])
    rows = db(q).select()
    for row in rows:
        for field in row:
            if field in db.upload_file.fields:
                db.upload_file[field].default = row[field]
 
... 
form = SQLFORM.factory(db.upload_file, fields=fields,
                       submit_button=T('Add to Print Queue') if not edit_mode else T('Update Queue'),
                       upload=URL('download'))
... 

If I am in edit mode and hit the "Update Queue" button, I get the validation error "Please select a file", even though I have prepopulated the defaults.
I have to click the "Choose File" button to select a file again, then it works.

Please help.
Thanks.

Massimo Di Pierro

unread,
Nov 25, 2016, 11:17:51 PM11/25/16
to web2py-users
You are you doing this:
if edit_mode:
    id = int(request.args[0])
    q = db.upload_file.id == id
    rows = db(q).select()
    for row in rows:
        for field in row:
            if field in db.upload_file.fields:
                db.upload_file[field].default = row[field]
 
... 
form = SQLFORM.factory(db.upload_file, fields=fields,
                       submit_button=T('Add to Print Queue') if not edit_mode else T('Update Queue'),
                       upload=URL('download'))
Instead of

                       button = T('Add to Print Queue') if not edit_mode else T('Update Queue')
                       form = SQLFORM(db.upload_file,  
                           request.args(0,cast=int,default=0), 
                           upload=URL('download'), submit_button=button).process()

Kenwyn Pilgrim

unread,
Dec 1, 2016, 10:15:25 AM12/1/16
to web2py-users
Massimo

Thanks. This works. Just 2 follow-up questions.

  1. Why does the Choose File button continue to say No file chosen? (The form submits though, with no validation errors)

  2. Can this be done with SQLFORM.factory instead of SQLFORM? Meaning that when I set the defaults, including setting the data for field that represents the upload file, I expect that if I hit the submit button as my first action, validation should be passed. What happens instead is that a validation error occurs that makes it seem that a file had not been had not been chosen.
(I noticed the online book (6th edition) does not have any info under the section Uploading Files with SQLFORM.factory.(http://www.web2py.com/book/default/chapter/07#Uploading-files-with-SQLFORMfactory))

Massimo Di Pierro

unread,
Dec 2, 2016, 5:18:51 PM12/2/16
to web2py-users
1. I do not now. that is outside of web2py control. it is controlled by the browser
2. you can just use

form = SQLFORM.factory(Field('myfile','upload')).process()

and then if form.accepted:

request.vars.myfile.file.seek(0)
data = request.vars.myfile.file.read()

Kenwyn Pilgrim

unread,
Dec 8, 2016, 4:07:39 PM12/8/16
to web2py-users
Massimo

Thank you.
Reply all
Reply to author
Forward
0 new messages