Since I have not received any answers here is how to do it.

The problem is that to create the links as requested you need access
to the whole subheading record, and the internal processing of crud
and SQLTABLE only gives you access to the value of one of the fields
at a time.

So how can you get to all values in a record?.


Using virtual fields, by adding these to the MODEL e.g.:

class HeadSubs:
  def linksub(self):
    return A(self.heading.title,
_href=URL('list_subheadings',args=[self.heading.id]))

db.heading.virtualfields.append(HeadSubs())

so now table 'heading' has a 'linksub' virtual field.
Note how you can use any field from the same row to build the virtual
one.


Following one of Massimo's recent videos the CONTROLLER looks like
this:

def reload(target): # note1
  def js(form):
    response.js='web2py_component("%s","%s")' %(URL(target),target)
  return js

def index():
  return dict()

def list_headings():
  return dict(
    form=crud.select(
      db.heading,
      orderby=db.heading.sequence,
      columns=['heading.linksub'] ) # note2
    or 'no headings')

def add_heading():
  return dict(
    form=crud.create(
      db.heading,
      onaccept=reload('list_headings'))) # note3


note1: to understand how this works look up "python nested functions",
but it is akin to a closure.

note2: with 'columns' we select only the virtual field which has the
link in the requested format.

note3: this will force a reload of 'list_headings' after a sucessfull
insertion.


To complete the use of components, the VIEW:

{{extend 'layout.html'}}
<h2>Headings</h2>
{{=LOAD(request.app, 'list_headings.load', ajax=True,
target='list_headings')}} # note4
<h3>Add heading</h3>
{{=LOAD(request.app, 'add_heading.load', ajax=True)}}

note4: the target is what ties the reload code near note3.


The use of virtual fields could be further expanded, for example
creating elements that have onclick using web2py_component to load
other parts.

Hope you find it useful.

Reply via email to