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

openstack horizon开发第一天的更多相关文章

  1. openstack horizon 开发第三天

    工作流:工作流是带有选项的复杂表单,每个工作流必须包含扩展Workflow, Step和的类Action1. url.py 路由处理 RESOURCE_CLASS = r'^(?P<resour ...

  2. openstack horizon 开发第二天

    依照上次的简单的仪表盘添加动作额外添加或修改的文件mydashboard/├── mypanel│   ├── forms.py│   ├── tables.py│   ├── templates│  ...

  3. python开发第一篇:初识python

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  4. openstack horizon 学习(3) DataTable

    上一篇中粗略的讲了下openstack中horizon的dashboard和panel的添加,本打算在这章中对有关于pluggable settings中的配置做详细的总结,然放弃了这念头.原因是搞懂 ...

  5. Electron-使用Electron开发第一个应用

    使用Electron开发第一个应用 Electron 应用的目录结构如下: app/ ├── package.json ├── main.js └── index.html 新建一个app文件夹 将这 ...

  6. Cordova - 使用Cordova开发iOS应用实战1(配置、开发第一个应用)

    Cordova - 使用Cordova开发iOS应用实战1(配置.开发第一个应用) 现在比较流行使用 html5 开发移动应用,毕竟只要写一套html页面就可以适配各种移动设备,大大节省了跨平台应用的 ...

  7. iOS开发——高级技术精选&底层开发之越狱开发第一篇

    底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...

  8. 【翻译习作】 Windows Workflow Foundation程序开发-第一章05

    1.3      开发我们的第一个工作流 也许你曾经在这样的产品经理手下搞过开发:他总是在你身边转悠,并不时的问一句“你还没做完吗?”.在这一部分,我们将用一个简单的Windows Workflow程 ...

  9. 【翻译习作】 Windows Workflow Foundation程序开发-第一章04

    1.2.3  Windows Workflow运行时 从Windows Workflow的角度看,可以将工作流活动当成是交给一个工作流处理器去执行的一系列指令或操作码.在Windows Workflo ...

随机推荐

  1. 3282. Tree【LCT】

    Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和 ...

  2. Alpha冲刺(5/10)——追光的人

    1.队友信息 队员学号 队员博客 221600219 小墨 https://www.cnblogs.com/hengyumo/ 221600240 真·大能猫 https://www.cnblogs. ...

  3. SERVICE问题解决方法

    这篇文章主要介绍了Windows服务器下出现ZendOptimizer.MemoryBase@NETWORK SERVICE问题解决方法,需要的朋友可以参考下 日志提示 事件 ID ( 2 )的描述( ...

  4. 2.编写实现:有一个三角形类Triangle,成员变量有底边x和另一条边y,和两边的夹角a(0<a<180),a为静态成员,成员方法有两个:求面积s(无参数)和修改角度(参数为角度)。 编写实现: 构造函数为 Triangle(int xx,int yy,int aa) 参数分别为x,y,a赋值 在main方法中构造两个对象,求出其面积,然后使用修改角度的方法,修改两边的夹角,再求出面积值。(提示

    求高的方法 h=y*Math.sin(a) 按题目要求,需要我们做的分别是:1.改角度2.显示角度3.求面积并显示 代码用到:1.静态成员变量以修改角度2.数学函数 以下具体代码具体分析 import ...

  5. 知乎live考研数学冲刺135+资料分享

    前言 各位学弟学妹,您好,live中本来是给出了我的邮箱,通过邮箱来获取资料,但是没有想到,后来我每天打开邮箱,都是需要回复的邮件,少则一两封,多则四五封,每天如此,也是一个比较繁琐费时的方式.我决定 ...

  6. PAT乙级1022

    1022 D进制的A+B (20 分)   输入两个非负 10 进制整数 A 和 B (≤2​30​​−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输入在一行中依次给出 3 ...

  7. 带编译器的codeblocks下载地址

    曾下载过一个没有编译器的codeblocks,弄了很久才发现自己下载的版本没有编译器,所以将带编译器的codeblocks放在腾讯微盘中,方便自己也方便他人,这样就不用去官网下载了,官网有时候真的是有 ...

  8. C++反汇编代码分析–函数调用

    转载:http://shitouer.cn/2010/06/method-called/ 代码如下:#include “stdlib.h” int sum(int a,int b,int m,int ...

  9. Sublime Text2中的快捷键一览表(Sublime 键盘快捷键大全 )

    快捷键 功能 ctrl+shift+n 打开新Sublime ctrl+shift+w 关闭Sublime,关闭所有打开文件 ctrl+shift+t 重新打开最近关闭文件 ctrl+n 新建文件 c ...

  10. Linux下onvi支持h265环境的的搭建:gsoap的安装及生产.c .h文件

     1. 下载gsoap  :http://www.genivia.com/products.html#notice,既Open Source gSOAP版本,并解压进入目录安装,configure后面 ...