I've been working with web2py for a while. Lastnight I updated to last
version, and my webforms collapsed (those constructed with
SQLFORM.factory).

More precisely, the problem appeared in the forms where I mix some
existing fields of the database with other fields defined on the run,
just like this example:
------------------------------------------------------------------------------
form = SQLFORM.factory(
  db.mytable.oneexistingfield,
  Field('nonexistingfield', 'string'),
  db.mytable.anotherexistingfield)
------------------------------------------------------------------------------


Anyway. After some minutes searching for the cause of the problem,
I've decided to start from scratch with an example. I downloaded the
version 1.91.4 (I'm using Ubuntu 10.04). I created a new application.

The model (very simple, I took it from web2py examples):
------------------------------------------------------------------------------
db.define_table('person',
   Field('name'))
db.define_table('dog',
   Field('name'),
   Field('owner', db.person))
------------------------------------------------------------------------------



Then, I wrote the "index" function on "default.py" controller:
------------------------------------------------------------------------------
def index():
   form = SQLFORM.factory(db.dog)
   dogs = db(db.dog.id>0).select()
   return dict(form=form, dogs=dogs)
------------------------------------------------------------------------------
In the view I just added {{=form}} and {{=BEAUTIFY(dogs)}}, just to
see the result of the function.



When I try to run the function, I receive the following error:
------------------------------------------------------------------------------
Traceback (most recent call last):
 File "/home/lisandro/pylicencias/gluon/restricted.py", line 188, in
restricted
   exec ccode in environment
 File "/home/lisandro/pylicencias/applications/prueba/controllers/
default.py", line 20, in <module>
 File "/home/lisandro/pylicencias/gluon/globals.py", line 95, in
<lambda>
   self._caller = lambda f: f()
 File "/home/lisandro/pylicencias/applications/prueba/controllers/
default.py", line 14, in index
   form = SQLFORM.factory(db.dog)
 File "/home/lisandro/pylicencias/gluon/sqlhtml.py", line 1182, in
factory
   return SQLFORM(SQLDB(None).define_table(table_name, *fields),
 File "/home/lisandro/pylicencias/gluon/dal.py", line 3314, in
define_table
   t._create_references()
 File "/home/lisandro/pylicencias/gluon/dal.py", line 3607, in
_create_references
   rtable = self._db[rtablename]
 File "/home/lisandro/pylicencias/gluon/dal.py", line 3335, in
__getitem__
   return dict.__getitem__(self, str(key))
KeyError: 'person'
------------------------------------------------------------------------------


The SAME code, but using SQLFORM(db.dog) instead of
SQLFORM.factory(db.dog), works just fine.
The SAME code, but with an older version of web2py, works just fine.
What happened to SQLFORM.factory? Some bug? Or it's just me that I'm
doing something wrong?

Thanks in advance.

Reply via email to