openstack horizon 开发第二天
依照上次的简单的仪表盘添加动作
额外添加或修改的文件
mydashboard/
├── mypanel
│ ├── forms.py
│ ├── tables.py
│ ├── templates
│ │ └── mypanel
│ │ ├── _create_snapshot.html
│ │ ├── create_snapshot.html
│ ├── urls.py
│ ├── views.py 1. forms.py 文件(model模型)
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _ #惰性翻译
from horizon import exceptions #处理api错误信息获取
from horizon import forms #表单类
from openstack_dashboard import api #openstack中api的调用
class CreateSnapshot(forms.SelfHandlingForm): #数据模型类,定义数据格式
instance_id=forms.CharField(label=_('Instance ID'),widget=forms.HiddenInput(),required=False) #实例id表单
name=forms.CharField(max_length=255,label=_('Snapshort Name')) #名称表单
def handle(self,request,data): #获取数据
try:
snapshot=api.nova.snapshot_create(request,data['instance_id'],data['name']) #调用api
return snapshot #返回快照
except Exception:
exceptions.handle(request,_('Unable to create snapshot')) 2. views.py文件(view视图)
from django.core.urlresolvers import reverse
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon.utils import memoized
from openstack_dashboard import api
from openstack_dashboard.dashboards.mydashboard.mypanel \
import forms as project_forms class CreateSnapshotView(forms.ModalFormView): #处理创建快照类
form_class = project_forms.CreateSnapshot #创建快照使用的模型
template_name = 'mydashboard/mypanel/create_snapshot.html' #创建快照使用的模板
success_url = reverse_lazy("horizon:project:images:index") #创建成功后跳转url
modal_id = "create_snapshot_modal" #
modal_header = _("Create Snapshot") #表单的头部名称
submit_label = _("Create Snapshot") #提交按钮名称
submit_url = "horizon:mydashboard:mypanel:create_snapshot" #表单提交地址 @memoized.memoized_method #添加缓存
def get_object(self): #获取验证实例
try:
return api.nova.server_get(self.request,
self.kwargs["instance_id"])
except Exception:
exceptions.handle(self.request,
_("Unable to retrieve instance.")) def get_initial(self): #获取instance_id
return {"instance_id": self.kwargs["instance_id"]} def get_context_data(self, **kwargs): #传递数据给form_class
context = super(CreateSnapshotView, self).get_context_data(**kwargs)
instance_id = self.kwargs['instance_id'] #添加id数据
context['instance_id'] = instance_id #添加id数据
context['instance'] = self.get_object() #添加实例对象
context['submit_url'] = reverse(self.submit_url, args=[instance_id]) #添加提交url
return context 3.tables.py文件(表格中添加动作)
from django.utils.translation import ugettext_lazy as _
from horizon import tables def is_deleting(instance):
task_state = getattr(instance, "OS-EXT-STS:task_state", None)
if not task_state:
return False
return task_state.lower() == "deleting" class CreateSnapshotAction(tables.LinkAction): #添加创建快照的动作
name = "snapshot" #动作的名称
verbose_name = _("Create Snapshot") #页面显示名称
url = "horizon:mydashboard:mypanel:create_snapshot" #获取提交表单url
classes = ("ajax-modal",) #class使用的提交方式
icon = "camera" # def allowed(self, request, instance=None): #检测实例的状态
return instance.status in ("ACTIVE") \ #如果是ACTIVE状态并且不是删除状态返回True
and not is_deleting(instance) class Meta(object):
name = "instances"
verbose_name = _("Instances")
table_actions = (MyFilterAction,)
row_actions = (CreateSnapshotAction,) #额外添加动作 4.urls.py文件(url路由关系映射)
from django.conf.urls import url from openstack_dashboard.dashboards.mydashboard.mypanel import views
urlpatterns = [
url(r'^(?P<instance_id>[^/]+)/create_snapshot/$',
views.CreateSnapshotView.as_view(),
name='create_snapshot'),
] 5.重新运行horizon
python manage.py runserver 0:8001 调用流程
页面访问http://172.24.2.10:6354/mydashboard/ --->urls.py路由处理---->
调用views视图函数 --->
调用tabs.py生成--->传递api数据给tables数据模型--->渲染模板---->返回views视图 GET 创建快照urlhttp://172.24.2.10:6354/mydashboard/<instance_id>/create_snapshot/ --->urls.py路由处理---->
调用views视图函数---->渲染创建模板获取实例对象传递给forms---渲染页面--->创建页面
POST ajax提交创建--->forms.handle处理创建--->创建成功跳转url 参考文档 https://docs.openstack.org/horizon/latest/contributor/tutorials/table_actions.html
openstack horizon 开发第二天的更多相关文章
- openstack horizon 开发第三天
工作流:工作流是带有选项的复杂表单,每个工作流必须包含扩展Workflow, Step和的类Action1. url.py 路由处理 RESOURCE_CLASS = r'^(?P<resour ...
- openstack horizon开发第一天
horizon插件构造 创建一个dashboardmkdir opesntack_dashboard/dashboards/mydashboardpython manage.py startdash ...
- openstack horizon 学习(3) DataTable
上一篇中粗略的讲了下openstack中horizon的dashboard和panel的添加,本打算在这章中对有关于pluggable settings中的配置做详细的总结,然放弃了这念头.原因是搞懂 ...
- iOS开发——高级技术精选&底层开发之越狱开发第二篇
底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...
- 8天玩转并行开发——第二天 Task的使用
原文 8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...
- ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
原文:ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 第二章 继承于WebControl的自定义控件 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支 ...
- 仿LOL项目开发第二天
仿LOL项目开发第二天 by草帽 接着上节来讲,上节更新还没开始写代码逻辑,今天我们补充完整. 我们找到VersionManager脚本里面的CheckVersion方法: 首先我们想到检测版本,需要 ...
- openstack horizon CSS 离线 改动
Openstack horizon 的CSS主要保存在几个文件夹中,各自是horizon/static/dashboard/scss;horizon/openstack_dashboard/stati ...
- Apache下配置Openstack Horizon (转)
非常详尽的Horizon配置介绍,转自 dev.cloudwatt.com Deploy Horizon from source with Apache and SSL Some companies ...
随机推荐
- C++设计模式 ==> 装饰(者)模式
简介 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.装饰模式使用对象嵌套的思想,实现对一个对象动态地进行选择性的属 ...
- Mysql引擎innodb_pool的作用
innodb_buffer_pool的简介: InnoDB主索引是聚簇索引,索引与数据共用表空间,对于InnoDB而言,数据就是索引,索引就是数据.InnoDB缓存机制和MyISAM缓存机制的最大区别 ...
- 乘风破浪:LeetCode真题_035_Search Insert Position
乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...
- 读高性能JavaScript编程 第三章
第三章 DOM Scripting 最小化 DOM 访问,在 JavaScript 端做尽可能多的事情. 在反复访问的地方使用局部变量存放 DOM 引用. 小心地处理 HTML 集合,因为他们表现 ...
- windows中使用git和开源中国
现学现卖,学了忘忘了学. 非常感谢OSC提供了这么好的一个国内的免费的git托管平台.这里简单说下TortoiseGit操作的流程.很傻瓜了首先你要准备两个软件,分别是msysgit和tortoise ...
- DevExpress11、TreeList
一.简介 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- 第二次SDN上机作业
SDN第二次作业 1.安装floodlight fatter树在floodlight上的连接显示 2.生成拓扑并连接控制器floodlight,利用控制器floodlight查看图形拓扑 floodl ...
- JS中的防抖与节流
什么是防抖?and什么是节流?一起来开心的学习下吧. 首先什么是防抖:就是在一定的时间内事件只发生一次,比如你点击button按钮,1秒内任你单身30年手速点击无数次,他也还是只触发一次.举个例子,当 ...
- 《python源代码剖析》笔记 python环境初始化
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zhsenl/article/details/33747209 本文为senlie原创.转载请保留此地 ...
- 动态显示checkbox选中条数
<script> $('input[type=checkbox]').click( function () { $('span#cheak_len').empty(); var len = ...