horizon插件構造
創建一個dashboard
mkdir opesntack_dashboard/dashboards/mydashboard
python manage.py startdash mydashboard --target=openstack_dashboard/dashboards/mydashboard
創建一個panel
mkdir opesntack_dashboard/dashboards/mydashboard/mypanel
python manage.py startpanel mypanel --target=openstack_dashboard/dashboards/mydashboard/mypanel
目錄結構
mydashboard/
├── dashboard.py
├── __init__.py
├── mypanel
│ ├── __init__.py
│ ├── forms.py #表單生成類
│ ├── tables.py #表格生成類
│ ├── tabs.py #調用表格生成類(獲取數據糅合tables,模板.數據)
│ ├── urls.py #url路由關系
│ ├── views.py #視圖函數
│ ├── panel.py #panel關系文件
│ ├── templates #模板文件
│ │ └── mypanel
│ │ ├── _create_snapshot.html
│ │ ├── create_snapshot.html
│ │ └── index.html
├── static 靜態文件目錄
│ └── mydashboard
│ ├── js
│ │ └── mydashboard.js
│ └── scss
│ └── mydashboard.scss
└── templates
└── mydashboard
└── base.html
1.dashboard.py文件(注冊horizon頁面dashboard文件)
from django.utils.translation import ugettext_lazy as _
import horizon
class Mygroup(horizon.PanelGroup): #子項目(panel組)類
name = _("My Group") #組名稱
slug = "mygroup" #唯一標識符
panels = ('mypanel',) #組下的panel
class Mydashboard(horizon.Dashboard): #dashboard類
name = _("My Dashboard") #dashboard名稱
slug = "mydashboard" #唯一標識符
panels = (Mygroup,) # 添加子項目
default_panel = 'mypanel' # 添加默認顯示項目
horizon.register(Mydashboard) #注冊dashboard
2.tables.py文件(生成tables模型) 數據模型model
from django.utils.translation ipmort ugettext_lazy as _
from horizon import tables
class MyFilterAction(tables.FilterAction): #表格過濾類
name='myfilter' #定義這個類的名稱
class InstancesTable(tables.DataTable):
#'name'檢索數據,verbose_name 數據列顯示的名稱
name=tables.Colum('name',verbose_name=_('Name')) #name表格字段
status=tables.Colum('status',verbose_name=_('Status')) #狀態字段
zone=tables.Colum('zone',verbose_name=_('Zone')) 可用域字段
image_name=tables.Colum('image',verbose_name('Image')) 鏡像字段
class Meta(object): #源數據類(instances表的元對象)
name='instances' #定義這個類的名稱
verbose_name=_('Instancees') #表的名稱
table_actions=(MyFilterAction,) #這個表的動作,執行MyFilterAction動作
3.tabs.py文件(tables的視圖文件) 數據視圖views(偽視圖類)
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions #錯誤調用api日志輸出
from horizon import tabs
from openstack_dashboard import api
from openstack_dashboard.dashboards.mydashboard.mypanel import tables
class InstanceTab(tabs.TableTab): #獲取實例數據類
name = _("Instances Tab") #定義了這個視圖類名稱
slug = "instances_tab" #唯一標識符
table_classes = (tables.InstancesTable,) #需要使用的table模型
template_name = ("horizon/common/_detail_table.html") #需要使用的tempalte模板(_detail_table分頁tables模板)
preload = False #數據的加載方式(默認使用api,True使用Ajax)
def has_more_data(self, table):
return self._has_more
def get_instances_data(self):
try:
marker = self.request.GET.get(
tables.InstancesTable._meta.pagination_param, None) #獲取當前傳遞的分頁參數
#獲取實例列表search_opts,marker頁數,paginate是否分頁,返回實例列表和帶有tenant信息的request
instances, self._has_more = api.nova.server_list(
self.request,
search_opts={'marker': marker, 'paginate': True})
return instances
except Exception: #獲取失敗返回
self._has_more = False
error_message = _('Unable to get instances')
exceptions.handle(self.request, error_message)
return []
class MypanelTabs(tabs.TabGroup): #tabs組類
slug = "mypanel_tabs" #唯一標識符
tabs = (InstanceTab,) #這個組存在的tab
sticky = True #是否處理tables生成tables頁面
4.views.py真正的views文件(總視圖文件)
from horizon import tabs
from openstack_dashboard.dashboards.mydashboard.mypanel \
import tabs as mydashboard_tabs
class IndexView(tabs.TabbedTableView): #tabs試圖類
tab_group_class = mydashboard_tabs.MypanelTabs #所使用的tab視圖類
template_name = 'mydashboard/mypanel/index.html' #所使用的總模板
def get_data(self, request, context, *args, **kwargs):
# Add data to the context here...
return context
5.urls.py(url路由處理文件)
from django.conf.urls import url
from openstack_dashboard.dashboards.mydashboard.mypanel import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
]
6.index模板文件(template模板)
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "My Panel" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("My Panel") %}
{% endblock page_header %}
{% block main %}
<div class="row">
<div class="col-sm-12">
{{ tab_group.render }} #嵌入tab視圖函數的模板(_detail_table.html)
</div>
</div>
{% endblock %}
7.編輯enable文件動態加載dashboard(文件名稱_50_mydashboard.py)
#添加dashboard到horizon
DASHBOARD = 'mydashboard'
#設置settings.disabled
DISABLED = False
#添加項目路徑到app中
ADD_INSTALLED_APPS = [
'openstack_dashboard.dashboards.mydashboard',
]
8.重新運行horizon
python manage.py runserver 0:8001
參考文檔 https://docs.openstack.org/horizon/latest/contributor/tutorials/dashboard.html
