I have a database with three tables, switch, hba and port.  The latter
is defined as:
db.define_table('port',
    SQLField('switch', db.switch),
    SQLField('name', 'string'),
    SQLField('hba', db.hba),
    )
db.port.name.requires = IS_NOT_EMPTY()
db.port.hba.requires = IS_IN_DB(db, 'hba.name')
db.port.switch.requires = IS_IN_DB(db, 'switch.name')

Perhaps foolishly, I want to use the same page to display all of the
ports for a given switch or for a given hba, so I added 'subset' and
'subset_id' to my request:
  http://127.0.0.1:8000/env_layout/default/ports?subset=switch&subset_id=1

Here's the code from my controller:

def ports():
    subset, subset_id = request.vars.subset, request.vars.subset_id
    if request.vars.subset:
        ports = db().select(db.port[subset] == subset_id,
orderby=db.port.name)
    else:
        ports = db().select(db.port.ALL, orderby=db.port.name)
    return dict(records=ports, subset=subset, subset_id=subset_id)

And here's my ports.html:
{{extend "layout.html"}}
<h1>Select a port...</h1>
<table>
<tr>
{{for field in ['name', 'switch', 'hba']:}}
  {{if field != subset:}}
    <th>{{=field}}</th>
    {{pass}}
  {{pass}}
</tr>
{{for port in records:}}
  <tr>
  {{for field in ['name', 'switch', 'hba']:}}
    {{if field == "name":}}
      <td>{{=A(port[field], _href=URL(r=request, f="port?id=%s" %
port.id))}}</td>
    {{elif field != subset:}}
      <td>{{=port[field]}}</td>
    {{pass}}
  {{pass}}
  </tr>
{{pass}}
</table><br><br>
{{=A("Add a new port", _href=URL(r=request, f="new_port"))}}

This query works OK:  http://127.0.0.1:8000/env_layout/default/ports
But this one generates a error:    
http://127.0.0.1:8000/env_layout/default/ports?subset=switch&subset_id=1

Traceback (most recent call last):
  File "gluon/restricted.py", line 107, in restricted
  File "C:\Program Files\web2py\applications\env_layout/views/default/
ports.html", line 40, in <module>
  File "gluon/sql.py", line 2363, in __iter__
  File "gluon/sql.py", line 2271, in __getitem__
  File "gluon/sql.py", line 1192, in __getitem__
KeyError: 'switch=1'

response.write('</div>\r\n        \r\n<h1>Select a port...</h1>\r
\n<table>\r\n<tr>\r\n',escape=False)
for field in ['name', 'hba', 'switch']:
    response.write('\r\n',escape=False)
    if field != subset:
        response.write('\r\n<th>',escape=False)
        response.write(field)
        response.write('</th>\r\n',escape=False)
        pass
    response.write('\r\n',escape=False)
    pass
response.write('\r\n</tr>\r\n',escape=False)
for port in records:   ### this is line 40 ###
    response.write('\r\n<tr>\r\n',escape=False)
    for field in ['name', 'hba', 'switch']:
        response.write('\r\n',escape=False)
        if field == "name":
            response.write('\r\n<td>',escape=False)
            response.write(A(port[field], _href=URL(r=request, f="port?
id=%s" % port.id)))
            response.write('</td>\r\n',escape=False)
        elif field != subset:
            response.write('\r\n<td>',escape=False)
            response.write(port[field])
            response.write('</td>\r\n',escape=False)
            pass
        response.write('\r\n',escape=False)
        pass
    response.write('\r\n</tr>\r\n',escape=False)
    pass
response.write('\r\n</table><br><br>\r\n',escape=False)

Any idea what's going on?  Or am I doing this all wrong and should be
taking a different approach?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py Web Framework" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to