Hm, that might be a last resort. I am trying to do something more in line with settatr, but unfortunately, even the fields to compute the virtual fields are variables and not strings in the function, which is also named after the virtual table instead of being a string argument. Seems quite tricky.
On Apr 9, 4:57 pm, Jay <jkel...@gmail.com> wrote: > I use this method for generating totally dynamic forms. > > 1. Create an array, say out > 2. Append "Field(<name>, <type>, <etc. etc.>)" to this array for all > fields I need - note this is a string, no function calls > 3. Wrap the above in an SQLFORM statement. > formstring = 'SQLFORM.factory(' +','.join(out)+')' > 4. Then eval the formstring to get the form > form = eval(formstring) > > You can use a similar method to create a table in the database > *** WARNING: I have not tested table creation, but it should work > **** WARNING: You can create the table, but because the definition of > the table in not in models dir, you will need to keep creating the > table each time you want to access the table. > If this table is to exist long term, you can write the generated text > (like formstring in #3 above) to a file and manually include it in a > model file. > > So to answer your question: > Do #1-2 as above > 3. Wrap the above in a define_table statement > deftabstring = "define_table('<tablename>,'" + ','.join(out)+')' -- > add "migrate=... as necessary > 4. Eval the deftabstring to create the table > mytab = eval(deftabstring) > > Assuming you use 'db' to get to the database, you can now user > db.<tablename> to get to your table. *Keep the second warning in > mind.* > > Aside: Many people out there do not like the use of eval, and will > criticize it right away. I use it when it is necessary. > NEVER USE EVAL WHEN THERE IS CHANCE OF USER INPUT IN UNPROCESSED FORM > BEING PART OF WHAT YOU EVAL, because you open a way to get hacked. > NEVER FORGET THIS! > > This is where programming gets interesting. > > Jay > > On Apr 9, 7:34 am, Serbitar <rserbi...@googlemail.com> wrote: > > > > > > > > > Sorry, misstyped and sent the message early. So once again: > > > I can create database fields from a list like this: > > > list = ["a","b","c","d"] > > fields = [] > > for entry in list: > > fields += [Field(entry, type="string")] > > db.define_table('test', *fields) > > > Now I want to have a virtual field for each field in the list. > > Any way to do this? As virtual field names are not strings but > > function names I got no idea how to do this.