fields strings to variable for fields=fields

46 views
Skip to first unread message

LoveWeb2py

unread,
Mar 27, 2015, 3:24:06 PM3/27/15
to web...@googlegroups.com
having trouble with the SQLFORM.smartgrid fields section

Fields only takes

fields = [db.mytable.field1, db.mytable.field2]

I have a function that returns all the fields to be returned, but they're in strings format.

fields = ['db.mytable.field1', 'db.mytable.field2'] #this returns an error with SQLFORM

How can I convert the strings to variables like in the first fields example.

JorgeH

unread,
Mar 27, 2015, 3:35:57 PM3/27/15
to web...@googlegroups.com

have you tried  eval  ??

fields
= [eval ('db.mytable.field1') , eval ('db.mytable.field2') ]





(just a suggestion. I didn't tried myself)

LoveWeb2py

unread,
Mar 27, 2015, 3:39:38 PM3/27/15
to web...@googlegroups.com
Hi JorgeH,

I didn't want to use eval due to code injection, but here is what I ended up using and it worked.

field_list
= ['db.mytable.field1', 'db.mytable.field2']

fields
= [getattr(db.mytable, i.split(".")[-1] for i in field_list]



and in SQLFORM fields=fields

Thanks everyone!1

Anthony

unread,
Mar 28, 2015, 11:29:21 AM3/28/15
to web...@googlegroups.com
On Friday, March 27, 2015 at 3:39:38 PM UTC-4, LoveWeb2py wrote:
Hi JorgeH,

I didn't want to use eval due to code injection, but here is what I ended up using and it worked.

field_list
= ['db.mytable.field1', 'db.mytable.field2']

fields
= [getattr(db.mytable, i.split(".")[-1] for i in field_list]


Note, you don't need to use getattr() -- just do:

[db.mytable[i.split('.')[-1]] for i in field_list]

A better option might be to change the function that returns the list so it returns just the field names (why does it need to return fields in 'db.mytable.field1' format?).

Anthony

Gray Kanarek

unread,
Mar 28, 2015, 12:14:44 PM3/28/15
to web...@googlegroups.com
With the information here http://www.web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#Run-time-field-and-table-modification

you can do db['mytable']['field1']. So you'd want something like: 

field_list_split = [i.split(.) for i in field_list]
fields
= [db[table][field] for dummy, table, field in field_list_split]


On Friday, March 27, 2015 at 3:39:38 PM UTC-4, LoveWeb2py wrote:
Reply all
Reply to author
Forward
0 new messages