With the above two solutions I cleaned up the code and it now works.

I had changed this:
[IS_NOT_EMPTY(),IS_NOT_IN_DB(db,db.shares.asx_code)]
to this
[IS_NOT_EMPTY(),IS_NOT_IN_DB(db,'shares.asx_code')]

and this:
{{for asx_code in shares:}}
{{=LI(shares.asx_code)}}
{{pass}}

to this:
{{for share in shares:}}
{{=LI(share.asx_code)}}
{{pass}}


After this I'm getting a list of each share, finally! As soon as read
your suggestion Nathan I twigged that 'share' is a variable created in
the loop just for the loop - the naming had me thinking I was
referencing a table or the earlier dict variable. So for reference, in
the code above, 'share' is just a counter and '.asx_code' is the
attribute, so the written flow is

For every row ('share' variable) found in the dictionary
'shares' (from the controller), show the asx_code variable for the
current row.


On May 2, 9:27 pm, Nathan Freeze <nat...@freezable.com> wrote:
> You're not using the iteration variable.
>
> This line:
> {{=LI(shares.asx_code)}}
>
> should be:
> {{=LI(asx_code.asx_code)}}
>
> But a more logical iteration variable would be 'share':
>
> {{extend 'layout.html'}}
> <h1>Share portfolio</h1>
> <ul>
> {{for share in shares:}}
> {{=LI(share.asx_code)}}
> {{pass}}
> </ul>
>
> On Sun, May 2, 2010 at 11:02 AM, ztd <zac.thompsondav...@gmail.com> wrote:
> > Hi,
>
> > here is an error I receive in a simple stock tracking application I'm
> > making to help me learn Web2Py:
>
> > Traceback (most recent call last):
> >  File "gluon/restricted.py", line 178, in restricted
> >  File "C:\Users\Zac\Desktop\web2py\applications\shares/views\default/
> > index.html", line 86, in <module>
> > AttributeError: 'Rows' object has no attribute 'asx_code'
>
> > I think the problem is to do with passing variables between the
> > controller and view. I've based this app on the 'image blog' example
> > in the book. Here is my code so far:
>
> > ---db.py---
>
> > db.define_table('shares',
> >    Field('asx_code'),
> >    Field('date_added','datetime',default=request.now),
> >    Field('quantity'),
> >    Field('buy_price'))
>
> > db.define_table('prices',
> >    Field('share_id',db.shares),
> >    Field('date','datetime',default=request.now),
> >    Field('price_low',default='0'),
> >    Field('price_high',default='0'),
> >    Field('price_close',default='0'))
>
> > db.shares.asx_code.requires =
> > [IS_NOT_EMPTY(),IS_NOT_IN_DB(db,db.shares.asx_code)]
> > db.shares.quantity.requires = IS_NOT_EMPTY()
> > db.shares.buy_price.requires = IS_NOT_EMPTY()
>
> > db.prices.share_id.requires = IS_IN_DB(db,db.shares.id,'%(asx_code)s')
>
> > db.prices.share_id.writable = db.prices.share_id.readable = False
>
> > ---index in default.py---
>
> > def index():
> >    shares=db().select(db.shares.ALL, orderby=db.shares.asx_code)
> >    return dict(shares=shares)
>
> > ---default/index.html---
>
> > {{extend 'layout.html'}}
> > <h1>Share portfolio</h1>
> > <ul>
> > {{for asx_code in shares:}}
> > {{=LI(shares.asx_code)}}
> > {{pass}}
> > </ul>
>
> > What am I doing wrong? i'm a bit confused with variables in the
> > controller, I have a table called shares, a variable declared in the
> > controller called shares and the value in the dictionary called shares
> > so it's very hard to know what I'm calling / using in the view!!! (the
> > LI code could be wrong, I couldn't get it to show anything to debug
> > that far). shares table contains two entries.
>
> > Thanks!

Reply via email to