14. Django 2.1.7 模型 - MVT模型增删功能_Django教程

上一篇Django 2.1.7 模型类 - 字段类型讲述了关于模型字段类的内容,丰富了不少模型中的字段类型。

本篇章再来改改之前的服务器中间件信息查询列表,增加添加和删除的功能。

参考文献

https://docs.djangoproject.com/zh-hans/2.1/topics/db/queries/

首先回顾一下之前项目的服务器中间件查询列表页面

14. Django 2.1.7 模型 - MVT模型增删功能_Django教程_02

好了,按照功能需求需要增加一个添加和删除的功能。

简单编写一下功能页面,有点丑,应付一下吧。

14. Django 2.1.7 模型 - MVT模型增删功能_Python_0314. Django 2.1.7 模型 - MVT模型增删功能_Python_04

HTML代码如下:

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<script type="text/javascript" src="js/jquery-3.0.0.min.js"></script>
<script type="text/javascript" src="js/popper.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<!-- 查询服务器信息表单 -->
<div class="row mt-5">
<form class="form-inline" method="POST" action="handler">
<div class="form-group mb-2">
<label for="serverinfo" class="sr-only">服务器信息</label>
<input type="text" readonly class="form-control-plaintext" id="serverinfo" value="服务器信息">
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="inputPassword2" class="sr-only">服务器名称</label>
<input type="text" class="form-control" id="servername" placeholder="服务器名称">
</div>
<button type="submit" class="btn btn-primary mb-2">查询</button>
</form>
<!-- 添加服务器信息 -->
<a class="btn btn-primary mb-2 ml-2" data-toggle="collapse" href="#collapseExample" role="button" aria-expanded="false" aria-controls="collapseExample">
添加中间件信息
</a>
<div class="collapse" id="collapseExample">
<div class="card card-body">
<!-- 提交中间件信息表单 -->
<form method="POST" action="addmiddlewareinfo">
<div class="form-group">
<label for="servername1">服务器名称</label>
<input type="text" class="form-control" id="servername1" aria-describedby="serverHelp" placeholder="Enter server name">
<small id="emailHelp" class="form-text text-muted">输入中间件所属的服务器名称.</small>
</div>
<div class="form-group">
<label for="midname1">中间件名称</label>
<input type="text" class="form-control" id="midname1" placeholder="middleware name">
</div>
<div class="form-group">
<label for="midport1">中间件端口号</label>
<input type="text" class="form-control" id="midport1" placeholder="middleware port">
</div>
<button type="submit" class="btn btn-outline-primary">添加</button>
</form>
</div>
</div>
</div>
<!-- 显示中间件信息表格 -->
<div class="row mt-5">
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">服务器名称</th>
<th scope="col">中间件名称</th>
<th scope="col">端口号</th>
<th scope="col">#</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>测试服务器</td>
<td>redis</td>
<td>6379</td>
<td><a href="deleteMiddlewareinfo?id=1" class="btn btn-outline-primary">删除</a></td>
</tr>
<tr>
<th scope="row">2</th>
<td>测试服务器</td>
<td>memcached</td>
<td>11211</td>
<td><a href="deleteMiddlewareinfo?id=1" class="btn btn-outline-primary">删除</a></td>
</tr>
<tr>
<th scope="row">3</th>
<td>测试服务器</td>
<td>kafka</td>
<td>9092</td>
<td><a href="deleteMiddlewareinfo?id=1" class="btn btn-outline-primary">删除</a></td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>

有了基本的静态页面之后,下面就是将这个页面的效果设置到Django的模板之中。然后用视图查询model数据获取展示效果。

将静态HTML设置模板

14. Django 2.1.7 模型 - MVT模型增删功能_Django教程_05

其他地方基本复制静态文件即可,然后对循环渲染的部分进行参数化delete操作,传送id作为删除的查询条件。

设置查询页面视图

14. Django 2.1.7 模型 - MVT模型增删功能_Django教程_06
def serverinfo(request):
# 1、查询所有服务器的信息
server_list = ServerInfo.objects.all()
# 2、查询所有服务器的中间件信息
info_list = []
for server in server_list:
# print(server.server_hostname)
m_query = MiddlewareInfo.objects.filter(server=server)
info_item = {"server_name": server.server_hostname, 'm_query': m_query}
info_list.append(info_item)
# 3、设置context内容
context = {
"info_list": info_list
}
# print(context)
return render(request,'assetinfo/serverinfo.html', context=context)

修改模板的相应的渲染参数

14. Django 2.1.7 模型 - MVT模型增删功能_Python_07
{% for info in info_list %}

{% for value in info.m_query %}
<tr>
<th scope="row">{{ value.id }}</th>
<td>{{ info.server_name }}</td>
<td>{{ value.name }}</td>
<td>{{ value.port }}</td>
<td><a href="deleteMiddlewareinfo?id={{ value.id }}" class="btn btn-outline-primary">删除</a></td>
</tr>
{% endfor %}

{% endfor %}

浏览器访问效果如下

14. Django 2.1.7 模型 - MVT模型增删功能_Python_08

下面来编写添加中间件信息的功能。

主要分为三个步骤: 1、设置模板传递的参数 2、编写视图接收参数 3、往数据库插入数据 4、返回页面

编写视图url路径

14. Django 2.1.7 模型 - MVT模型增删功能_Python_09

编写视图内容

14. Django 2.1.7 模型 - MVT模型增删功能_Python_10

接收表单传递过来的参数,然后查询服务器信息,再插入中间件信息。 最后返回serverinfo页面。

浏览器执行效果如下

14. Django 2.1.7 模型 - MVT模型增删功能_Python_1114. Django 2.1.7 模型 - MVT模型增删功能_Python_12

好了,增加功能已经有了。下面就要开始来编写删除功能了。

删除功能的实现步骤

目前查询列表是没有判断数据是否删除的,也就是没有is_delete字段的判断。 实现步骤如下:

  • 在serverinfo视图增加 is_delete 的判断。
  • 编写删除功能视图
  • 删除数据后返回页面

在serverinfo视图增加 is_delete 判断

14. Django 2.1.7 模型 - MVT模型增删功能_Django教程_13
def serverinfo(request):
# 1、查询所有服务器的信息
server_list = ServerInfo.objects.all()
# 2、查询所有服务器的中间件信息
info_list = []
for server in server_list:
# print(server.server_hostname)
m_query = MiddlewareInfo.objects.filter(server=server)

mid_info_list = []
for i in range(0,len(m_query)):
# print("is_delete = ", m_query[i].is_delete)
if m_query[i].is_delete == False:
mid_info_list.append(m_query[i])

info_item = {"server_name": server.server_hostname, 'm_query': mid_info_list}
info_list.append(info_item)
# 3、设置context内容
context = {
"info_list": info_list
}
# print(context)
return render(request,'assetinfo/serverinfo.html', context=context)

编写删除视图功能

14. Django 2.1.7 模型 - MVT模型增删功能_Python_14
def deleteMiddlewareinfo(request):
# 1、接收需要删除中间件的id
mid_id = request.GET.get('id','')
# 2、根据id设置中间件的is_delete = True
mid_ware = MiddlewareInfo.objects.get( id = mid_id )
mid_ware.is_delete = True
mid_ware.save()
# return HttpResponse(mid_id)
return redirect('/assetinfo/serverinfo')

测试删除功能

14. Django 2.1.7 模型 - MVT模型增删功能_Django教程_1514. Django 2.1.7 模型 - MVT模型增删功能_Python_16

成功删除了。