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 ...
随机推荐
- 【bzoj4543】[POI2014]Hotel加强版
题目 抄题解.jpg 发现原来的\(O(n^2)\)的换根\(dp\)好像行不通了呀 我们考虑非常牛逼的长链剖分 我们设\(f[x][j]\)表示在\(x\)的子树中距离\(x\)为\(j\)的点有多 ...
- 【转】Android业务组件化之URL Scheme使用
前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...
- 2018年1月12日--微信小程序----出错报告(40kb的原因)---并解决方法
一. 报错的原因是因为,图片的文件太大了,已经超过了40kb...不能超过40kb. 在这里查看图片文件的大小:
- mac下用xattr命令来删除文件的扩展属性
mac下发现不能用记事本打开文本文件,ls -la 发现格式后面有个@ wenke-mini:changeServer wenke$ ls -la total 144 drwxr-xr-x 20 w ...
- 集合之Vector
在java提高篇(二一)—–ArrayList.java提高篇(二二)—LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...
- c++——默认参数、函数占位参数
2 默认参数 /*1 C++中可以在函数声明时为参数提供一个默认值, 当函数调用时没有指定这个参数的值,编译器会自动用默认值代替 */ void myPrint(int x = 3) { printf ...
- [LuoguP1462]通往奥格瑞玛的道路($SPFA+$二分)
#\(\mathcal{\color{red}{Description}}\) \(Link\) 有一个图,求其在\(1-N\)的最短路小于一个给定值下,点权最大值的最小值. #\(\mathcal{ ...
- 通过ReentrantLock简单了解下并发包中的锁
ReentrantLock在进行实例化时,可以通过构造函数的参数选择是否使用公平锁FairSync或者非公平锁NonfairSync,两者的区别比较简单,如果是公平锁则新来的线程会先检测同步队列中是否 ...
- linux系统分析工具之Blktrace
Blktrace简介: blktrace是一个针对Linux内核中块设备I/O层的跟踪工具,用来收集磁盘IO信息中当IO进行到块设备层(block层,所以叫blk trace)时的详细信息(如IO请求 ...
- js面向对象案例 贪吃蛇
食物对象 (function () { //map:所在的父盒子,obj自身的一些属都具有默认值 function Food(map, obj) { obj = obj || {}; //没有则使用默 ...