表视图¶
例子¶
让我们以时间表多维数据集中的示例为例:
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}
要获取可编辑表,可以使用 cellvids , finalvid 或 nonfinalvid .
上一个示例的结果是:

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

同样,您可以通过设置为所选实体显示其他操作 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)。
每种方法的优点/缺点¶
EntityTableView
和 RsetableView
提供基本相同的功能集,尽管它们不共享相同的属性。我们来总结一下每门课的优缺点。
EntityTableView 视图为:
更详细,但通常更容易理解
易于扩展(例如,易于添加/删除列)
不依赖于特定的RSET形状。只需给它一个标题,并将在“可能的视图”框中列出(如果有的话)。
RsetTableView 视图为:
很难击败显示结果集,或者在某些情况下 headers , displaycols 或 cellvids 可以定义为在不关心分页或面时增强表。
几乎不可扩展,因为通常需要更改调用视图以修改RQL的位置(因此视图的结果集形状)。