Openstack -- Horizon二次开发(二)

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简单示例,其还包含了很多内置方法,复写后能完成更为复杂的功能,可参见官网中详细介绍。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值