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 ...
随机推荐
- 3.2Python的循环结构语句:
返回总目录 目录: 1.while循环 2.for循环 3.循环保留字:break与continue 循环总览: (一)while循环: (1)单个while循环: while 条件: 循环体 ...
- win10 损坏 bios?
自从前几个月升级为win10后,主板莫名奇妙的就出问题了,遇到3块不同型号2块技嘉b75,1块微信ph67 技嘉b75-ds3v 技嘉b75m-d3v 微星ph67s-c43 ms-7673 1.0 ...
- C语言实现输出杨辉三角
1.倒推法实现输出杨辉三角右半部分,代码如下: #include<stdio.h> int main() { ]; printf("请输入行数n:"); scanf(& ...
- Terminal Service 终端链接
2008 64位前有这项服务,之后就与远程管理合并了 如果要设置他的连接数可以去 桌面 --> 管理工具 --> 远程桌面服务 最大数设置成1个好了
- bower包管理工具
安装: npm install bower -g (全局安装) 验证: bower --version 指令( 以vue为例 ): 1. bower info vue 查看 ...
- NOIP模拟赛-2018.11.7
NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...
- java字节码的工具(含IDEA插件)
转:https://blog.csdn.net/qq_34039315/article/details/78561493 javap方式 最基础的方式,此处不做介绍 windows下的工具jclass ...
- 【题解】[HNOI2008]神奇的国度—BZOJ1006。
之前说顺着打BZOJ结果又被自己给鸽了qwq. ------------------------------------ 言归正传这道题应该怎么做. 先给大家普及一下弦图(连接环上俩个不相邻节点的边称 ...
- Redis未授权漏洞利用方式
总结一下redis未授权拿shell: redis-cli -h ip >info 查看系统类型 Windows: 1.找网站绝对路径 2.config set dir 绝对路径根路径 conf ...
- 【转】 python中 * 的用法
转自:https://www.cnblogs.com/jony7/p/8035376.html 1.表示乘号 2.表示倍数,例如: def T(msg,time=1): print((msg+' ...