openstack horizon开发第一天
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开发第一天的更多相关文章
- openstack horizon 开发第三天
工作流:工作流是带有选项的复杂表单,每个工作流必须包含扩展Workflow, Step和的类Action1. url.py 路由处理 RESOURCE_CLASS = r'^(?P<resour ...
- openstack horizon 开发第二天
依照上次的简单的仪表盘添加动作额外添加或修改的文件mydashboard/├── mypanel│ ├── forms.py│ ├── tables.py│ ├── templates│ ...
- python开发第一篇:初识python
一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...
- openstack horizon 学习(3) DataTable
上一篇中粗略的讲了下openstack中horizon的dashboard和panel的添加,本打算在这章中对有关于pluggable settings中的配置做详细的总结,然放弃了这念头.原因是搞懂 ...
- Electron-使用Electron开发第一个应用
使用Electron开发第一个应用 Electron 应用的目录结构如下: app/ ├── package.json ├── main.js └── index.html 新建一个app文件夹 将这 ...
- Cordova - 使用Cordova开发iOS应用实战1(配置、开发第一个应用)
Cordova - 使用Cordova开发iOS应用实战1(配置.开发第一个应用) 现在比较流行使用 html5 开发移动应用,毕竟只要写一套html页面就可以适配各种移动设备,大大节省了跨平台应用的 ...
- iOS开发——高级技术精选&底层开发之越狱开发第一篇
底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章05
1.3 开发我们的第一个工作流 也许你曾经在这样的产品经理手下搞过开发:他总是在你身边转悠,并不时的问一句“你还没做完吗?”.在这一部分,我们将用一个简单的Windows Workflow程 ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章04
1.2.3 Windows Workflow运行时 从Windows Workflow的角度看,可以将工作流活动当成是交给一个工作流处理器去执行的一系列指令或操作码.在Windows Workflo ...
随机推荐
- Day2 CSS
什么是CSS 层叠样式表(cascading style sheet) 控制页面元素的显示方式.(添加样式) CSS语法 行间样式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出C ...
- 针对IE及其它的css hack
现在一些针对针对政府的oa项目还要去解决兼容IE6 7 8,这对前端开发来说简直是灾难,在要使用一些css3,或者H5的地方,我们就要慎重了,在使用新特性的同时要兼顾老的浏览器的,做到优雅降级,或者针 ...
- Mysql 多实例实施步骤
基本理论:利用同一套安装程序,不同配置文件,不同启动程序,不同数据目录.有公用资源,也有私有资源. 实现步骤: 1.正常安装mysql,二进制安装或者编译安装. 2.创建mysql多实例总目录,总目录 ...
- VC++中的__super::
在学习别人的代码时,发现了一个__super,第一感觉很像java中的super,或者C#中的base网上查了一下发现作用差不多,都是指父类.C++本身没有__super,这是visual c++的扩 ...
- ASP.NET Razor引入命名空间(视图中数据序列化)
问题描述: 视图有时可以作为保存数据的载体,使用Razor语法给我们带来便捷的同时,也会使我们陷入局限.@可以保存int.bool.string等类型,但却保存不了对象类型,例如Dictionary. ...
- C语言程序设计I—第十一周教学
第十一周教学总结(12/11-17/11) 教学内容 第4章 循环结构-break continue嵌套循环 4.3 判断素数,4.4求1! + 2! + -. + 100! 课前准备 在蓝墨云班课发 ...
- P1474 货币系统 Money Systems
题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单 ...
- Ext4文件系统架构分析(三) ——目录哈希、扩展属性与日志
struct dx_root Htree的内部节点: struct dx_node Htree 树根和节点中都存在的 Hash map: struct dx_entry 1.20 扩展属性EA 扩展属 ...
- MySQL 5.7(免安装版)的下载,安装(配置)
本文适合初学JAVA,要用到MySQL开发的学习者. 第一步.下载MySQL 1. 百度mysql,找到官网,点击进入. 2. 进入官网,点击DOWNLOADS,在DOWNLOADS菜单栏中点击Com ...
- linux中服务环境的搭建
一.Samba服务 samba服务的安装及配置: sudo apt-get install samba 二.配置: 1.创建一个需要共享的目录,并修改权限: lpf@ubuntu:~$ mkdir l ...