tables.Action
tables.DataTable中会配合tables.Action使用,快速开发出表格某些功能。官网中给出了一些常用的action:
http://docs.openstack.org/developer/horizon/topics/tables.html?highlight=action
其中比较常见的有Action,FilterAction,和 LinkAction。
在tables.DataTable在定义时,其subclass Meta中有两个属性table_actions和row_actions,均接受一个tuple参数。个人理解table_actions是对整张表的一个操作,通常页面中会在表格顶端上方多出一些操作按钮。而row_actions表格内容一行元素对应的操作内容,通常页面中会在表格最后一列。
tables.FilterAction
承接之前多表格panel,修改其中的tables.py文件中租户定义内容如下:
#添加一个租户过滤器定义,并且在租户定义中绑定到table_actions中。
class TenantsFilter(tables.FilterAction):
name = 'tenants_filter'
def filter(self, table, data, filter_string):
q = filter_string.lower()
return [t for t in data if q in t.name.lower()]
class TenantsTable(tables.DataTable):
name = tables.Column('name', verbose_name=_('Name'))
id = tables.Column('id', verbose_name=_('Project ID'))
enabled = tables.Column('enabled', verbose_name=_('Enabled'))
class Meta:
name = "tenants"
verbose_name = _("Tenants")
table_actions = (TenantsFilter, )
修改后界面效果展示如下:
这是一个简单的按名字过滤出表格选项的过滤器,在利用tables.FilterAction时,要对其filter方法进行复写。data就是表中内容组成的list,filter_string是在输入框中输入的字符串。直接在输入框中输入筛选字符串回车,向服务器提交POST请求,完成过滤返回界面。
tables.LinkAction
个人理解就是添加一个操作按钮,并为这个按钮提供一个链接跳转到该链接。
承接上示例继续修改tables.py文件
#添加tables.LinkAction定义,并绑定在表格定义的row_actions中
class TenantDetail(tables.LinkAction):
name = "detail"
verbose_name = _("Tenant Detail")
url = "horizon:mydashboard:multidatatable:detail"
class TenantsTable(tables.DataTable):
name = tables.Column('name', verbose_name=_('Name'))
id = tables.Column('id', verbose_name=_('Project ID'))
enabled = tables.Column('enabled', verbose_name=_('Enabled'))
class Meta:
name = "tenants"
verbose_name = _("Tenants")
table_actions = (TenantsFilter, )
row_actions = (TenantDetail, )
添加detail链接,修改urls.py如下:
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<tenant_id>[^/]+)/detail/$',
views.DetailTenantView.as_view(), name='detail'),
]
完成对应DetailTenantView视图:
from django.core.urlresolvers import reverse
class DetailTenantView(views.HorizonTemplateView):
template_name = 'mydashboard/multidatatable/detail.html'
page_title = "{{ tenant.name }}"
def get_context_data(self, **kwargs):
context = super(DetailTenantView, self).get_context_data(**kwargs)
tenant = self.get_data()
table = TenantsTable(self.request)
context["tenant"] = tenant
context["url"] = reverse("horizon:mydashboard:multidatatable:index")
context["actions"] = table.render_row_actions(tenant)
return context
def get_data(self):
try:
tenant_id = self.kwargs['tenant_id']
tenant = api.keystone.tenant_get(self.request, tenant_id)
except Exception:
exceptions.handle(self.request,
_('Unable to retrieve tenant details.'),
redirect=reverse("horizon:mydashboard:multidatatable:index"))
return tenant
mydashboard/multidatatable/detail.html内容如下:
{% extends 'base.html' %}
{% load i18n %}
{% load breadcrumb_nav %}
{% block title %}{% trans "Tenant Details" %}{% endblock %}
{% block page_header %}
<div class='page-header'>
{% breadcrumb_nav %}
</div>
{% endblock %}
{% block main %}
<div class="row">
<div class="col-sm-12">
<div class="detail">
<dl class="dl-horizontal">
<dt>{% trans "Tenant Name" %}</dt>
<dd>{{ tenant.name }}</dd>
<dt>{% trans "Tenant ID" %}</dt>
<dd>{{ tenant.id }}</dd>
<dt>{% trans "Enabled" %}</dt>
<dd>{{ tenant.enabled|yesno|capfirst }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ tenant.description|default:_("None") }}</dd>
</dl>
</div>
</div>
</div>
{% endblock %}
实际结果显示如下:
点击Tenant Detail按钮跳转到租户详细界面:
上例仅仅是一个tables.LinkAction简单示例,其还包含了很多内置方法,复写后能完成更为复杂的功能,可参见官网中详细介绍。