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 ...
随机推荐
- python set集合一些基本方法
set集合是一个无序且不重复的元素集合 这个数据类型没有重复的,而且也没有顺序 一些基本的方法: 添加元素 s1 = {11, 22, 33} s1.add(123)#添加一个新的元素 print(s ...
- RSA 非对称加密,私钥转码为pkcs8 错误总结
RSA 非对称加密,私钥转码为pkcs8 错误总结 最近在和某上市公司对接金融方面的业务时,关于RSA对接过程中遇到了一个坑,特来分享下解决方案. 该上市公司简称为A公司,我们简称为B公司.A-B两家 ...
- October 11th 2017 Week 41st Wednesday
If you don't know where you are going, you might not get there. 如果你不知道自己要去哪里,你可能永远到不了那里. The reward ...
- PyQt5--CustomizeSignal
# -*- coding:utf-8 -*- ''' Created on Sep 14, 2018 @author: SaShuangYiBing Comment: This example is ...
- Volley源码分析(一)RequestQueue分析
Volley源码分析 虽然在2017年,volley已经是一个逐渐被淘汰的框架,但其代码短小精悍,网络架构设计巧妙,还是有很多值得学习的地方. 第一篇文章,分析了请求队列的代码,请求队列也是我们使用V ...
- 1.HBase In Action 第一章-HBase简介(后续翻译中)
This chapter covers ■ The origins of Hadoop, HBase, and NoSQL ■ Common use cases for HBase ■ A basic ...
- Java POI单元格使用心得
1: /** * Created by liuguangxin on 2018/5/16. * <p> * MergeRegion:表示excel中cell的信息,startRow与end ...
- Docker技术入门与实战 第二版-学习笔记-7-数据管理(volume)
Docker 数据管理 为什么要进行数据管理呢?因为当我们在使用container时,可能会在里面创建一些数据或文件,但是当我们停掉或删除这个容器时,这些数据或文件也会同样被删除,这是我们并不想看见的 ...
- jenkins报错;自定义工作目录;
[1]no such file 报错: 如果jdk配置路径错误,有可能会报这样的错误: 其实只要在/etc/profile中配置好JAVA_HOME就足够了: 对应的系统配置框,留空不新加即可: [2 ...
- apache-httpd工作模式
[root@app1 conf]# ../bin/apachectl -lCompiled in modules: core.c mod_access.c mod_auth.c mod_include ...