Anthony, being so helpful as you are, you need by no means to apologize.
Thank you so much.
Best regards.

El martes, 6 de junio de 2017, 21:15:29 (UTC+2), Anthony escribió:
>
> Sorry, I forgot about that -- you can in fact use a virtual field. 
> However, for it to work properly, you must specify the table name when 
> defining the virtual field:
>
> db.auth_user.full_name = Field.Virtual('full_name', 
>                                        lambda row: '%s %s' %(row.auth_user
> .first_name,
>                                                              row.auth_user
> .last_name),
>                                        table_name='auth_user')
>
> Also, note that when you use a virtual field with autocomplete, it selects 
> all records (and all fields) in the table and does the filtering in Python, 
> so this could be quite slow for large tables.
>
> Anthony
>
> On Tuesday, June 6, 2017 at 9:51:33 AM UTC-4, Carlos Kitu wrote:
>>
>> Thanks a lot, Anthony.
>> I use to check the framework code before posting questions, and when I 
>> saw this in the callback method of the autocomplete widget:
>> def callback(self): 
>>     if self.keyword in self.request.vars: 
>>         field = self.fields[0] 
>>         if type(field) is Field.Virtual: 
>>             records = [] 
>>             table_rows = self.db(self.db[field.tablename]).select(orderby
>> =self.orderby)
>>
>> I guessed wrongly that virtual fields were supported.
>> Thank you and best regards.
>>
>> El lunes, 5 de junio de 2017, 17:11:37 (UTC+2), Anthony escribió:
>>>
>>> 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 web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to