CMDB资产管理系统开发【day26】:admin action
本节目标
审核写到数据库,我就单独写一个如下的 页面

单机go后就跳转到如下图界面,我们这节课的目标就是写一个这样的页面

asset\admin.py部分代码 注释如下:
class NewAssetApprovalZoneAdmin(admin.ModelAdmin):
list_display = ('sn','asset_type','manufactory','model','cpu_model','cpu_count','cpu_core_count','ram_size','os_distribution','os_release','date','approved','approved_by','approved_date')
actions = ['approve_selected_objects'] def approve_selected_objects(modeladmin, request, queryset):
selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
print("----select",selectd) '''
ACTION_CHECKBOX_NAME 是获取选中的id
两个的id都打印出来?为什么是2,checkbox在后台获取的就不是一个了,是一个列表
获取的是一个列表 getlist 4,2 是什么?
就是那个自增ID
''' ct = ContentType.objects.get_for_model(queryset.model)
return HttpResponseRedirect("/asset/new_assets/approval/?ct=%s&ids=%s" % (ct.pk, ",".join(selected)))
approve_selected_objects.short_description = "批准入库" '''在菜单下拉框中显示"批准入库"'''
ACTION_CHECKBOX_NAME是什么?

两个的id都打印出来?为什么是2,checkbox在后台获取的就不是一个了,是一个列表
checkbox在后台获取方式

getlist 4,2 是什么?

获取的就是那个自增ID
为什么要获取这两个东西?
你要跳到一个新的页面,跳转了一个url,你没有办法把对象传过去,所以你要获取这两个东西
数据回报到哪里呢?
1、asset\admin.py文件下的
return HttpResponseRedirect("/asset/new_assets/approval/?ct=%s&ids=%s" % (ct.pk, ",".join(selected)))
2、asset\url.py下的
url(r'^new_assets/approval/$', views.new_assets_approval, name="new_assets_approval"),
3、asset\views.py文件下的
def new_assets_approval(request):
'''是以get还是以post跳转过去的?是以get方式跳转过去的,所以以下代码我们就不用看post代码了,直接看get方法"'''
if request.method == 'POST':
request.POST = request.POST.copy()
approved_asset_list = request.POST.getlist('approved_asset_list')
approved_asset_list = models.NewAssetApprovalZone.objects.filter(id__in=approved_asset_list) response_dic = {}
for obj in approved_asset_list:
request.POST['asset_data'] = obj.data
ass_handler = core.Asset(request)
if ass_handler.data_is_valid_without_id():
ass_handler.data_inject()
obj.approved = True
obj.save() response_dic[obj.id] = ass_handler.response
return render(request, 'assets/new_assets_approval.html',
{'new_assets': approved_asset_list, 'response_dic': response_dic})
else:
ids = request.GET.get('ids')
'''获取到ids,ids是那?是我们刚选中的那几条数据'''
id_list = ids.split(',')
new_assets = models.NewAssetApprovalZone.objects.filter(id__in=id_list) return render(request, 'assets/new_assets_approval.html', {'new_assets': new_assets})
'''
从待批准区里把这几条数据过滤出来返回到这个new_assets_approval.html地址,
另外一个页面就是列出要批准的资产,问你要不要批准
前端页面代码
{% extends 'base.html' %}
{% block page-container %}
<div class="eq-height">
<div class="col-sm-4 eq-box-sm">
<!--Panel with Header-->
<!--===================================================-->
<div class="panel">
<div class="panel-heading">
<h3 class="panel-title" style="color: red; ">确认要将下列资产存入数据库么?</h3>
</div>
<div class="panel-body">
<form method="post" action="{% url 'new_assets_approval' %}">{% csrf_token %}
<table class="table table-hover">
<tr>
<th>#</th>
<th>SN</th>
<th>资产类型</th>
<th>厂商</th>
<th>型号</th>
<th>CPU型号</th>
<th>CPU颗数</th>
<th>CPU核数</th>
<th>内存大小</th>
<th>汇报日期</th>
</tr>
{% for new_asset in new_assets %}
<tr data-set="{{ new_asset.id }}">
<td>{{ forloop.counter }}</td>
<td>{{ new_asset.sn }}</td>
<td>{{ new_asset.asset_type }}</td>
<td>{{ new_asset.manufactory }}</td>
<td>{{ new_asset.model }}</td>
<td>{{ new_asset.cpu_model}}</td>
<td>{{ new_asset.cpu_count}}</td>
<td>{{ new_asset.cpu_core_count}}</td>
<td>{{ new_asset.ram_size}}</td>
<td>{{ new_asset.date }}</td>
{% if new_asset.id in response_dic %}
<td><a href="#asset_{{ new_asset.id }}">执行结果</a></td>
{% endif %}
</tr>
{% endfor %}
</table>
<select name="approved_asset_list" class="hide" multiple>
{% for new_asset in new_assets %}
<option value="{{ new_asset.id }}" selected>{{ new_asset.sn }}</option>
{% endfor %}
</select>
<input type="submit" value="Yes, I'm sure" class="btn btn-danger">
</form>
<div >
{% for key,msg in response_dic.items %}
<div>
{% for asset in new_assets %}
{% if asset.id == key %}
<h4 id="asset_{{ asset.id }}"><a style="color:deepskyblue" href="/admin/assets/asset/?q={{ asset.sn }}" target="_blank">{{ asset.sn }} </a> | {{ asset.manufactory }} {{ asset.model }} | {{ asset.cpu_model }} </h4>
{% endif %}
{% endfor %}
<p style="color: green">
{% for item in msg.info %}
{{ item |safe}}
<br/>
{% endfor %}
</p>
<p style="color: red">
{% for item in msg.error %}
{% if 'Warning' in item.keys.0 %}
<span style="color:orange;">{{ item }}</span>
{% else %}
{{ item }}
{% endif %}
<br/>
{% endfor %}
</p>
</div>
<hr/>
{% endfor %}
</div>
</div>
</div>
<!--===================================================-->
<!--End Panel with Header-->
<button id="scroll-top" class="btn"><i class="fa fa-chevron-up"></i></button>
</div>
</div>
{% endblock %}
测试效果截图
一、选中要批准的资产,下拉框选择批准入库,单机go提交

二、确认要将下列资产存入数据库吗?YES

三、 绿色代表资产已创建了,红色的是磁盘数据缺失

四、 看看资产表已经写入成功

CMDB资产管理系统开发【day26】:admin action的更多相关文章
- CMDB资产管理系统开发【day26】:Django admin
想实现的是一个表里面的字段 选择性的出现在菜单栏 1.如何自定义菜单 自定义菜单前 在asset\admin.py里添加如下代码: class NewAssetApprovalZoneAdmin(ad ...
- CMDB资产管理系统开发【day26】:数据正式存入待存区
1.from表单提交 1.数据提交到哪里呢? 提交到assets/new_assets_approval.html这了 2.Yes, I'm sure提交了什么? 为什么没有下拉框了 ...
- CMDB资产管理系统开发【day26】:实现资产自动更新
1.需求分析 1.比对分析 比对的时候以那个数据源为主? old [1,2,3 ] db数据库 new [2,3,4 ] 客户端汇报过来的 当然以客户端汇报过来的数据为主 2.更新分析 不同的表到底拿 ...
- CMDB资产管理系统开发【day26】:批准资产入库
刚才都是一条像内存,硬盘,网卡.多条的话如何操作 只有一条数据 下面的是有多条数据的 硬盘必须字段的验证 def __create_disk_component(self): disk_info = ...
- CMDB资产管理系统开发【day26】:CMDB上节回顾
一.上节知识点回顾 服务器设计了一个表结构 开发了一个客户端 二.后台创建缓存区表 客户端连接服务器,在服务器的下面看报错信息 因为URL都没有写,所以我找不到呀 1.在MadKing\url.py ...
- CMDB资产管理系统开发【day26】:02-数据写入待存区
一.资产自动回报数据及个更新流程图 二.表结构注释(NewAssetApprovalZone) class NewAssetApprovalZone(models.Model): "&quo ...
- CMDB资产管理系统开发【day26】:linux客户端开发
客户端疑难点及获取流程 1.linux客户端支持2就可以,python3就是很麻烦 难道你要求所有的客户端都上pytho3吗? 现在从bin的入口进去 HouseStark.ArgvHandler(s ...
- CMDB资产管理系统开发【day25】:需求分析
本节内容 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infra ...
- CMDB资产管理系统开发【day25】:表结构设计1
资产表 # _*_coding:utf-8_*_ __author__ = 'jieli' from assets.myauth import UserProfile from django.db i ...
随机推荐
- c/c++ 重载运算符 标准库function的用法
重载运算符 标准库function的用法 问题:int(int, int)算不算一种比较通用的类型?? 比如函数: int add(int a, int b); 比如lambda:auto mod = ...
- MongoDB的导入与导出
一.导入与导出可以操作本地的mongodb也可以是远程的mongodb,通用选项: -h host 主机 --port port 端口 -u username 用户名 -p password 密码 如 ...
- SQL 数据类型
Microsoft Access.MySQL 以及 SQL Server 所使用的数据类型和范围. Microsoft Access 数据类型 数据类型 描述 存储 Text 用于文本或文本与数字的组 ...
- MongoDB 创建基础索引、组合索引、唯一索引以及优化
一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...
- [看图说话]在VMware Workstation 9中安装Mac OS X 10.8 Mountain Lion
本文环境: CPU:Intel Core i7 920: OS:Windows 7: 内存:8G: 玩Hackintosh各有各的理由,不管什么理由,利用虚拟机安装Mac OS X都是一个可行的办法. ...
- openflow流表分析(草稿)
OVS bridge 有两种模式:“normal” 和 “flow”.“normal” 模式的 bridge 同普通的 Linux 桥,而 “flow” 模式的 bridge 是根据其流表(flow ...
- BZOJ3174 TJOI2013 拯救小矮人 贪心、DP
传送门 原问题等价于:先给\(n\)个人排好顺序.叠在一起,然后从顶往底能走即走,问最多能走多少人 注意到一个问题:如果存在两个人\(i,j\)满足\(a_i + b_i < a_j + b_j ...
- 数据接口测试工具 Postman 介绍
此文介绍好用的数据接口测试工具 Postman,能帮助您方便.快速.统一地管理项目中使用以及测试的数据接口. 1. Postman 简介 Postman 一款非常流行的 API 调试工具.其实,开发人 ...
- JS 面向对象 ~ 继承的7种方式
前言: 继承 是 OO 语言中的一个最为人津津乐道的概念.许多 OO 语言都支持两种继承方式:接口继承 和 实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在 ...
- 细述:nginx http内核模块提供的变量和解释
导读 ngx_http_core_module模块在处理请求时,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以用于其它nginx模块. 在我们对请求做策略如改写等等都会使用到一些变量,顺便 ...