依照上次的简单的仪表盘添加动作
额外添加或修改的文件
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 开发第二天的更多相关文章

  1. openstack horizon 开发第三天

    工作流:工作流是带有选项的复杂表单,每个工作流必须包含扩展Workflow, Step和的类Action1. url.py 路由处理 RESOURCE_CLASS = r'^(?P<resour ...

  2. openstack horizon开发第一天

    horizon插件构造 创建一个dashboardmkdir opesntack_dashboard/dashboards/mydashboardpython manage.py startdash ...

  3. openstack horizon 学习(3) DataTable

    上一篇中粗略的讲了下openstack中horizon的dashboard和panel的添加,本打算在这章中对有关于pluggable settings中的配置做详细的总结,然放弃了这念头.原因是搞懂 ...

  4. iOS开发——高级技术精选&底层开发之越狱开发第二篇

    底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...

  5. 8天玩转并行开发——第二天 Task的使用

    原文 8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...

  6. ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件

    原文:ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 第二章 继承于WebControl的自定义控件 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支 ...

  7. 仿LOL项目开发第二天

    仿LOL项目开发第二天 by草帽 接着上节来讲,上节更新还没开始写代码逻辑,今天我们补充完整. 我们找到VersionManager脚本里面的CheckVersion方法: 首先我们想到检测版本,需要 ...

  8. openstack horizon CSS 离线 改动

    Openstack horizon 的CSS主要保存在几个文件夹中,各自是horizon/static/dashboard/scss;horizon/openstack_dashboard/stati ...

  9. Apache下配置Openstack Horizon (转)

    非常详尽的Horizon配置介绍,转自 dev.cloudwatt.com Deploy Horizon from source with Apache and SSL Some companies ...

随机推荐

  1. 3.2Python的循环结构语句:

    返回总目录 目录: 1.while循环 2.for循环 3.循环保留字:break与continue 循环总览: (一)while循环: (1)单个while循环: while 条件:     循环体 ...

  2. win10 损坏 bios?

    自从前几个月升级为win10后,主板莫名奇妙的就出问题了,遇到3块不同型号2块技嘉b75,1块微信ph67 技嘉b75-ds3v 技嘉b75m-d3v 微星ph67s-c43 ms-7673 1.0 ...

  3. C语言实现输出杨辉三角

    1.倒推法实现输出杨辉三角右半部分,代码如下: #include<stdio.h> int main() { ]; printf("请输入行数n:"); scanf(& ...

  4. Terminal Service 终端链接

    2008 64位前有这项服务,之后就与远程管理合并了 如果要设置他的连接数可以去 桌面 --> 管理工具 --> 远程桌面服务 最大数设置成1个好了

  5. bower包管理工具

    安装: npm install bower -g (全局安装) 验证: bower --version 指令( 以vue为例 ): 1.  bower info vue              查看 ...

  6. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  7. java字节码的工具(含IDEA插件)

    转:https://blog.csdn.net/qq_34039315/article/details/78561493 javap方式 最基础的方式,此处不做介绍 windows下的工具jclass ...

  8. 【题解】[HNOI2008]神奇的国度—BZOJ1006。

    之前说顺着打BZOJ结果又被自己给鸽了qwq. ------------------------------------ 言归正传这道题应该怎么做. 先给大家普及一下弦图(连接环上俩个不相邻节点的边称 ...

  9. Redis未授权漏洞利用方式

    总结一下redis未授权拿shell: redis-cli -h ip >info 查看系统类型 Windows: 1.找网站绝对路径 2.config set dir 绝对路径根路径 conf ...

  10. 【转】 python中 * 的用法

    转自:https://www.cnblogs.com/jony7/p/8035376.html 1.表示乘号 2.表示倍数,例如: def T(msg,time=1):    print((msg+' ...