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.

Reply via email to