One year later I still can't display virtual field in the SQLFORM.grid with
an error:
<type 'exceptions.AttributeError'> 'Row' object has no attribute 'broj'
And my virtual field is defined as:
db.define_table('fin_fis',
Field('god','integer',label=T('Year')),
Field('pod','reference sif_pod',label=T('Company'),writable=False,
readable=False),
Field('oj','reference sif_oj',label=T('Department')),
Field('kasa','integer',label=T('Billing device')),
Field('vd','reference sif_vd',label=T('Document type')),
Field('br','integer',label=T('Number')),
Field.Virtual('broj',lambda row:
'%05d/P%03d%03d/%d'%(row.fin_fis.br,row.fin_fis.oj,row.fin_fis.vd,row.fin_fis.kasa),label='Broj'),
.....
)
This is my field list:
fields =
(db.fin_fis.oj,db.fin_fis.kasa,db.fin_fis.br,db.fin_fis.broj,db.fin_fis.dvi,db.fin_fis.iznrac,db.fin_fis.npl,db.sif_radnici.ime,
db.sif_radnici.prezime)
I'm using: 2.9.5-stable+timestamp.2014.03.16.02.35.39 (Running on
Apache/2.4.9 (Ubuntu), Python 2.7.3)
Dana subota, 20. srpnja 2013. 11:54:24 UTC+2, korisnik peckto napisao je:
>
> I think i can explain this behaviour.
> The statement "var in list" cals the lists __contains__ method,
> which loops through the list and compares each element with var.
> But in case of an Field object the equals operator (__eq__) has another
> meaning,
> it's the "WHERE" part of the db query:
> db(db.table.id==1).select()
> So this comparison will olways return True.
>
>
> Am Samstag, 20. Juli 2013 09:00:52 UTC+2 schrieb Massimo Di Pierro:
>>
>> Strange. Ok. I changed it again. Can you please check it. I am still
>> trying to avoid the double loop for every virtual table.
>>
>> On Friday, 19 July 2013 16:54:05 UTC-5, peckto wrote:
>>>
>>> Regarding your changes:
>>> + all_fields = filter(lambda nv: nv[1] in fields and
>>> + isinstance(nv[1],(FieldVirtual,
>>> FieldMethod)),
>>> + table.iteritems())
>>> It doesn't work. It ends up in returning all virtual fields, even when
>>> they are not requested.
>>> It's because of the "var in list" statement:
>>> nv[1] in fields
>>> always returns True. I don't know why.
>>>
>>> Another solution would be to use the id() function:
>>> id(nv[1]) in [id(f_) for f_ in fields]
>>> but you have overwritten this function
>>> 2091: id = value
>>>
>>> So I came finally to the complicated looking statement:
>>> nv[0] in [f_.name for f_ in fields] and nv[1].tablename == tablename
>>>
>>> Maybe you can tell me why the "var in list" statement fails
>>> or we use one of the other solutions (while renaming the id value).
>>>
>>
--
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.