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 ...
随机推荐
- 在TortoiseSVN使用clean up
1.在[Cleanup]窗体中勾选中复选框[Clean up working copy status],选中该复选框表示解除锁定. 2.在[Cleanup]窗体中勾选中复选框[revert all c ...
- Qt分页导航控件
最近在使用QTableWidget时,因为结果数量比较多而且又有单元格控件,为了改善效率要做分页处理.在网上找了一番,最后在http://www.cppblog.com/biao/archive/20 ...
- Springboot整合log4j2日志全解
目录 常用日志框架 日志门面slf4j 为什么选用log4j2 整合步骤 引入Jar包 配置文件 配置文件模版 配置参数简介 Log4j2配置详解 简单使用 使用lombok工具简化创建Logger类 ...
- 将Vue-cli搭建的项目改造成多页面应用时对项目结构和配置的调整
创建项目 首先初始化一个Vue项目模板,之后在模板下载时候会弹出如下配置选项 vue init webpack demo 配置好后按下回车就构建完成了Vue脚手架,之后cd进入项目,并且进行node模 ...
- [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]
[NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...
- BZOJ2580:[USACO]Video Game(AC自动机,DP)
Description Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the ...
- [Message123] JMS 与 MQ
https://www.cnblogs.com/steven520213/p/6810369.html JMS的队列消息传递过程如下图(消费者与生产者): JMS的主题消息传递过程如下图(发布/订阅) ...
- Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-2-Compose 命令说明
Compose 命令说明 1)命令对象与格式 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中 的服务或者容器.如果没有特别的说明,命令对象将是项目,这意味着项目中所有 ...
- mac apache的使用
因为apache的安装目录/private/etc是默认隐藏的,所以我们需要通过文件夹前往/命令行的方法去找. 或命令行中输入: userdeMBP:~ user$ open /etc 然后都会打开相 ...
- 杀掉gpu上的程序
https://blog.csdn.net/flysky_jay/article/details/82142254 当然也可以使用top找进程,但这种方式更好