表视图

例子

让我们以时间表多维数据集中的示例为例:

class ActivityResourcesTable(EntityView):
    __regid__ = 'activity.resources.table'
    __select__ = is_instance('Activity')

    def call(self, showresource=True):
        eids = ','.join(str(row[0]) for row in self.cw_rset)
        rql = ('Any R,D,DUR,WO,DESCR,S,A, SN,RT,WT ORDERBY D DESC '
               'WHERE '
               '   A is Activity, A done_by R, R title RT, '
               '   A diem D, A duration DUR, '
               '   A done_for WO, WO title WT, '
               '   A description DESCR, A in_state S, S name SN, '
               '   A eid IN (%s)' % eids)
        rset = self._cw.execute(rql)
        self.wview('resource.table', rset, 'null')

class ResourcesTable(RsetTableView):
    __regid__ = 'resource.table'
    # notice you may wish a stricter selector to check rql's shape
    __select__ = is_instance('Resource')
    # my table headers
    headers  = ['Resource', 'diem', 'duration', 'workpackage', 'description', 'state']
    # I want a table where attributes are editable (reledit inside)
    finalvid = 'editable-final'

    cellvids = {3: 'editable-final'}
    # display facets and actions with a menu
    layout_args = {'display_filter': 'top',
                   'add_view_actions': None}

要获取可编辑表,可以使用 cellvidsfinalvidnonfinalvid .

上一个示例的结果是:

../../../_images/views-table-shadow.png

为了激活工作台过滤机制, display_filter 选项作为布局参数提供。一个小箭头将显示在表格的右上角。点击 show filter form 操作,将按如下方式显示筛选窗体:

../../../_images/views-table-filter-shadow.png

同样,您可以通过设置为所选实体显示其他操作 add_view_actions 布局选项到 True .这将添加视图返回的操作 table_actions() .

您可以注意到结果集的所有列都没有显示。这是因为给予 headers ,表示只显示从0到len(标题)的列。

同时注意到 ResourcesTable 视图依赖于特定的RQL形状(顺便说一下,这并不能保证,唯一选中的是结果集包含 Resource 类型)。这通常意味着您不能将此视图用于特定于用户的查询(例如,由方面生成或手动键入)。

所以另一个选择是使用 EntityTableView ,如下所示。

class ResourcesTable(EntityTableView):
    __regid__ = 'resource.table'
    __select__ = is_instance('Resource')
    # table columns definition
    columns  = ['resource', 'diem', 'duration', 'workpackage', 'description', 'in_state']
    # I want a table where attributes are editable (reledit inside)
    finalvid = 'editable-final'
    # display facets and actions with a menu
    layout_args = {'display_filter': 'top',
                   'add_view_actions': None}

    def workpackage_cell(entity):
        activity = entity.reverse_done_in[0]
        activity.view('reledit', rtype='done_for', role='subject', w=w)
    def workpackage_sortvalue(entity):
        activity = entity.reverse_done_in[0]
        return activity.done_for[0].sortvalue()

    column_renderers = {
        'resource': MainEntityColRenderer(),
        'workpackage': EntityTableColRenderer(
           header='Workpackage',
           renderfunc=workpackage_cell,
           sortfunc=workpackage_sortvalue,),
        'in_state': EntityTableColRenderer(
           renderfunc=lambda w,x: w(x.cw_adapt_to('IWorkflowable').printable_state),
           sortfunc=lambda x: x.cw_adapt_to('IWorkflowable').printable_state),
     }

注意以下几点:

  • cell_<column>(w, entity) 将搜索以呈现单元格的内容。如果找不到, column 应为的属性 entity .

  • cell_sortvalue_<column>(entity) 应返回一个用于JavaScript排序的类型化值,或不可排序列的类型化值(默认值)。

  • 这个 etable_entity_sortvalue() decorator将为包含主实体的列设置一个“sortValue”函数(作为所有方法的参数提供的列),该函数将调用 entity.sortvalue() .

  • 可以使用 etable_header_title() 装饰师。此标题将被翻译。如果它不是已经存在的msgid,请考虑使用 _() (该示例假设头是模式定义的msgid)。

每种方法的优点/缺点

EntityTableViewRsetableView 提供基本相同的功能集,尽管它们不共享相同的属性。我们来总结一下每门课的优缺点。

  • EntityTableView 视图为:

    • 更详细,但通常更容易理解

    • 易于扩展(例如,易于添加/删除列)

    • 不依赖于特定的RSET形状。只需给它一个标题,并将在“可能的视图”框中列出(如果有的话)。

  • RsetTableView 视图为:

    • 很难击败显示结果集,或者在某些情况下 headersdisplaycolscellvids 可以定义为在不关心分页或面时增强表。

    • 几乎不可扩展,因为通常需要更改调用视图以修改RQL的位置(因此视图的结果集形状)。