DataGridにアンカーを

Turbogears::datagridへのアンカー埋め込み 風に舞う羽毛のようなものたち/ウェブリブログ@paginate() — TurboGears 1.0 documentationの後半を参考に、以下のように組み立ててみる。

from elementtree import ElementTree as ET
from controllers import controllers

# generate the link inside the datagrid
class MakeLink:
  def __init__(self, baseurl, title=None, param=None):
    self.baseurl = baseurl
    if title:
      self.title = title
    else:
      self.title = lambda obj:str(obj)
    
    if param:
      self.param = param
    else:
      self.param = lambda obj:{}
  
  
  def __call__(self, obj):
    url=controllers.url(self.baseurl, self.param(obj))
    link = ET.Element('a', href=url, style='text-decoration: underline' )
    link.text = self.title(obj)
    return link

のように用意しておいて、以下のように利用する。

link_pc = myutil.MakeLink('show_form_edit_pc', lambda obj: obj.pcid, lambda obj: dict(pcid=obj.pcid))

pc_list = PaginateDataGrid(fields = [
    PaginateDataGrid.Column('pcid', title=u'PC-ID', getter=link_pc, options={'sortable':True, 'reverse_order':True}),
    # 後略

すると、/show_form_edit_pc?pcid=pcid のようにリンクが張られる。便利。