thank you so much for your hints and pointers pbreit, btw, an error occured
when i tried to do it.

e.g. 1.
=== controller ===
def index():
    pages = db(db.page.id > 0).select(orderby = db.page.title)
    comments = db(db.comment.id > 0).select()
    for comment in comments:
        comment_groups[comment.page_id].append(comment)
    return dict(pages = pages, comment_groups = comment_groups)

=== view ===
<ol>
{{for page in pages:}}
    <li>{{=page.name}}<br>
        <ol>{{for comment in comment_groups[page.id]:}}
            <li>{{=comment.body}}</li>
             {{pass}}
        </ol>
     </li>
{{pass}}
</ol>

=== traceback ===
Traceback (most recent call last):
  File "/home/sugizo/web2py/gluon/restricted.py", line 181, in restricted
    exec ccode in environment
  File "/home/sugizo/web2py/applications/a/controllers/default.py", line 61,
in <module>
  File "/home/sugizo/web2py/gluon/globals.py", line 133, in <lambda>
    self._caller = lambda f: f()
  File "/home/sugizo/web2py/applications/a/controllers/default.py", line 6,
in index
    return dict(pages = pages, comment_groups = comment_groups)
NameError: global name 'comment_groups' is not defined

e.g. 2.
=== controller ===
def index():
    pages = db(db.page.id > 0).select(orderby = db.page.title)
    comments = db(db.comment.id > 0).select()
    return dict(pages = pages, comments = comments)

=== view ===
<ol>
{{for page in pages:}}
    <li>{{=page.name}}<br>
        <ol>{{for comment in comments:}}
                {{if comment.page_id == page.id:}}
                <li>{{=comment.body}}</li>
                {{pass}}
             {{pass}}
        </ol>
     </li>
{{pass}}
</ol>

=== traceback ===
Traceback (most recent call last):
  File "/home/sugizo/web2py/gluon/restricted.py", line 181, in restricted
    exec ccode in environment
  File "/home/sugizo/web2py/applications/a/views/default/index.html", line
4, in <module>
    <ol>{{for comment in comments:}}
  File "/home/sugizo/web2py/gluon/dal.py", line 3532, in __getattr__
    return self[key]
  File "/home/sugizo/web2py/gluon/dal.py", line 3523, in __getitem__
    return dict.__getitem__(self, key)
KeyError: 'name'

did anyone ever have the same problem to show multiple tables in 1 page?
any hints and pointers are greatly appreciate, thank you so much.

On Mon, May 16, 2011 at 9:53 AM, pbreit <pbreitenb...@gmail.com> wrote:

> Hard to say the best way to do it. This might be one way (not tested).
>
> === controller ===
> def index():
>     pages = db(db.page.id>0).select(orderby = db.page.title)
>     comments = db(db.comment.id>0).select()
>     return dict(pages=pages, comments=comments)
>
> === view ===
> <ol>
> {{for page in page:}}
>     <li>{{=page.name}}<br>
>         <ol>{{for comment in comments if comment.page_id==page.id:}}
>             <li>{{=comment.body}}</li>
>              {{pass}}
>         </ol>
>      </li>
> {{pass}}
> </ol>
>
>
> There's probably a much more efficient way to do it since the "for comment
> in comments" loop goes through all comments for each page. The way you had
> it didn't really make any sense because you were getting all the pages but
> then just the comments for one (unspecified) page. "db(db.comment.page_id
> == db.page.id).select()" is going to return ALL comments. If you want the
> comments for just one page you would do something like db(db.comment.page_id
> == r <http://db.page.id/>equest.args(0)).select().
>
> To make it more efficient, you might be able to group the comments in the
> controller. I don't know if this works, it's kind of a guess.
>
> def index():
>     pages = db(db.page.id>0).select(orderby = db.page.title)
>     comments = db(db.comment.id>0).select()
>     for comment in comments:
>         comment_groups[coment.page_id].append(comment)
>     return dict(pages=pages, comment_groups=comment_groups)
>
> <ol>
> {{for page in page:}}
>     <li>{{=page.name}}<br>
>         <ol>{{for comment in comment_groups[page.id]:}}
>             <li>{{=comment.body}}</li>
>              {{pass}}
>         </ol>
>      </li>
> {{pass}}
> </ol>
>

Reply via email to