You cannot use autocomplete to search a virtual field. It runs a database
query, so the field must exist in the database.
Anthony
On Monday, June 5, 2017 at 9:23:51 AM UTC-4, Carlos Kitu wrote:
>
> Good afternoon,
> I'm trying to create an autocomplete field to search in the table
> db.auth_user, but the search must be done with the full name.
> As db.auth_user has two separate fields (first_name, and last_name), I
> created a virtual field to compose both fields:
>
> db.auth_user.full_name = Field.Virtual('full_name', lambda row: '%s %s' %(
> row.auth_user.first_name, row.auth_user.last_name))
>
> Then, I used the autocomplete widget in a field:
>
> db.define_table('my_table',
> Field('my_user', 'reference auth_user', notnull=True, unique=False, label
> ='User'),
> ...
> )
>
>
> db.my_table.my_user.widget = SQLFORM.widgets.autocomplete(
> request, db.auth_user.full_name, id_field=db.auth_user.id, db=db,
> at_beginning=False, limitby=(0, 10), min_length=2)
>
>
>
> And I get this error when creating a new form:
>
> <type 'exceptions.AttributeError'> 'DAL' object has no attribute 'None'
> Versión
> web2py™ Version 2.14.6-stable+timestamp.2016.05.10.00.21.47Rastreo
>
> 1.
> 2.
> 3.
> 4.
> 5.
> 6.
> 7.
> 8.
> 9.
> 10.
> 11.
> 12.
> 13.
> 14.
> 15.
> 16.
> 17.
> 18.
> 19.
> 20.
> 21.
> 22.
>
> Traceback (most recent call last):
> File "/home/clm/Documentos/p/productos/web2py_2.14.6/gluon/restricted.py",
> line 227, in restricted
> exec ccode in environment
> File
> "/home/clm/Documentos/p/productos/web2py_2.14.6/applications/VREscalas/controllers/default.py"
>
> <https://127.0.1.1:8000/admin/default/edit/VREscalas/controllers/default.py>,
> line 1119, in <module>
> File "/home/clm/Documentos/p/productos/web2py_2.14.6/gluon/globals.py",
> line 417, in <lambda>
> self._caller = lambda f: f()
> File "/home/clm/Documentos/p/productos/web2py_2.14.6/gluon/tools.py", line
> 4241, in f
> return action(*a, **b)
> File
> "/home/clm/Documentos/p/productos/web2py_2.14.6/applications/VREscalas/controllers/default.py"
>
> <https://127.0.1.1:8000/admin/default/edit/VREscalas/controllers/default.py>,
> line 140, in programas
> lambda row: A('resumen', _href=URL(
> File "/home/clm/Documentos/p/productos/web2py_2.14.6/gluon/sqlhtml.py",
> line 2307, in grid
> create_form = SQLFORM(table, **sqlformargs)
> File "/home/clm/Documentos/p/productos/web2py_2.14.6/gluon/sqlhtml.py",
> line 1288, in __init__
> inp = field.widget(field, default)
> File "/home/clm/Documentos/p/productos/web2py_2.14.6/gluon/sqlhtml.py",
> line 748, in __call__
> table_rows =
> self.db(self.db[self.fields[0].tablename]).select(orderby=self.orderby)
> File
> "/home/clm/Documentos/p/productos/web2py_2.14.6/gluon/packages/dal/pydal/base.py",
> line 914, in __getitem__
> return self.__getattr__(str(key))
> File
> "/home/clm/Documentos/p/productos/web2py_2.14.6/gluon/packages/dal/pydal/base.py",
> line 921, in __getattr__
> return BasicStorage.__getattribute__(self, key)
> AttributeError: 'DAL' object has no attribute 'None':
>
>
> I printed in console the self.fields[0]:
> self.fields {'comment': None, 'represent': <function <lambda> at
> 0x7f6c907310c8>, 'widget': None, 'name': 'full_name', 'f': <function
> <lambda> at 0x7f6c90731050>, 'requires': None, 'readable': True, 'label':
> 'Full
> name', 'writable': False, 'filter_out': None, 'tablename': None,
> 'formatter': <function IDENTITY at 0x7f6c9e090140>, 'type': 'string'}
>
> It happens that the db.auth_user.full_name.tablename is None, i.e., the
> virtual field have no tablename attibute as the autocomplete code seems to
> expect.
> Should I open a ticket?
>
> Thank you and best regards.
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.