python3.6+django2.0开发一套学员管理系统


Posted in Python onMarch 03, 2018

1.在pycharm中新建project demo1 添加app01 点击create按钮完成新建

2.在demo项目目录下新建目录static,并在settings.py中追加代码:

STATICFILES_DIRS=(os.path.join(BASE_DIR, 'static'),)

3.在setting.py中添加模板路径:

TEMPLATES = [
 {
  'BACKEND': '...',
  'DIRS': [os.path.join(BASE_DIR, 'templates'),],
  'APP_DIRS': ...,
  'OPTIONS': {
   'context_processors': [
    ...
   ],
  },
 },
]

4.学员管理系统数据库设计:

在app01/model.py目录下建立 班级、老师、学生 、老师与班级关联表 四张表:

from django.db import models

# Create your models here.


class Classes(models.Model):
 '''
 班级表
 '''
 title=models.CharField(max_length=32)
 a=models.ManyToManyField('Teachers')


class Teachers(models.Model):
 '''
 老师表
 '''
 name=models.CharField(max_length=32)


class Students(models.Model):
 username=models.CharField(max_length=32)
 age=models.IntegerField()
 gender=models.BooleanField()
 cs=models.ForeignKey(Classes,on_delete=models.CASCADE)

在终端Terminal 项目目录下执行数据表更新命令:

python manage.py makemigrations
python manage.py migrate

至此生成了四张数据表,可以在pycharm中,点开右上角的Database面板,然后将项目中templates目录下边的db.sqlite3鼠标拖拽到Database面板下,对新创建的数据表进行查看。

5.学员管理系统之班级管理:

为了方便分别操作班级、老师、学生相关的业务,将app01目录下的views.py 删掉,在app01目录下新建目录views,并在views目录下 新建classes.py teachers.py students.py。

1.在classes.py 中写 get_classes add_classes del_classes edit_classes四个函数,完成对 班级数据 的增删改查:

from django.shortcuts import render,redirect
from app01 import models


def get_classes(request):
 cls_list = models.Classes.objects.all()
 return render(request,'get_classes.html',{'cls_list':cls_list})

def add_classes(request):
 if request.method=='GET':
  return render(request,'add_classes.html')
 elif request.method=='POST':
  title=request.POST.get('title','')
  models.Classes.objects.create(title=title)
  return redirect('/classes.html')

def del_classes(request):
 nid=request.GET.get('nid','')
 models.Classes.objects.filter(id=nid).delete()
 return redirect('/classes.html')

def edit_classes(request):
 if request.method=="GET":
  nid = request.GET.get('nid', '')
  obj=models.Classes.objects.get(id=nid)
  return render(request,'edit_classes.html',{'obj':obj})
 elif request.method=="POST":
  nid=request.POST.get('nid','')
  title=request.POST.get('xxoo','')
  models.Classes.objects.filter(id=nid).update(title=title)
  return redirect('/classes.html')

2.在urls.py 中配置url路由:

from django.contrib import admin
from django.urls import path
from app01.views import classes,students,teachers

urlpatterns = [
 path('admin/', admin.site.urls),
 path('classes.html', classes.get_classes),
 path('add_classes.html', classes.add_classes),
 path('del_classes.html', classes.del_classes),
 path('edit_classes.html', classes.edit_classes),
 # path('teachers.html', teachers.get_teachers),
 # path('students.html', students.get_studernts),

]

3.在template目录下建立所需的html页面文件:

get_classes.html

DOCTYPE html>
<html lang="en">
<head>
 <style>
  tr td{ border:1px solid #000;text-align:center;}
 </style>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<div>
 <table>
  <thead>
   <tr>
    <th>ID</th> <th>名称</th> <th>操作</th>
   </tr>
  </thead>
  <tbody>
   {% for row in cls_list %}
   <tr>
    <td>{{ row.id }}</td>
    <td>{{ row.title }}</td>
    <td><a href="/del_classes.html?nid={{ row.id }}" rel="external nofollow" rel="external nofollow" >删除</a>
     |<a href="/edit_classes.html?nid={{ row.id }}" rel="external nofollow" rel="external nofollow" >编辑</a>
    </td>
   </tr>
   {% endfor %}
  </tbody>
 </table>
</div>

<div><a href="/add_classes.html" rel="external nofollow" rel="external nofollow" >添加</a> </div>
</body>
</html>

add_classes.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<form action="/add_classes.html" method="post">
 {% csrf_token %}
 <input type="text" name="title">
 <input type="submit" value="提交">
</form>
</body>
</html>

edit_classes.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<form method="post" action="/edit_classes.html">
 {% csrf_token %}
 <input type="hidden" name="nid" value="{{ obj.id }}">
 <input type="text" name="xxoo" value="{{ obj.title }}">
 <input type="submit" value="提交">
</form>

</body>
</html>

6.学员管理系统之学员管理: 1.在students.py 中写 get_students add_students del_students edit_students 四个函数,完成对 学生数据 的增删改查:

from django.shortcuts import render,redirect
from app01 import models


def get_students(request):
 stu_list=models.Students.objects.all()
 return render(request,'get_students.html',{'stu_list':stu_list})


def add_students(request):
 if request.method=='GET':
  cs_list=models.Classes.objects.all()
  return render(request,'add_students.html',{'cs_list':cs_list})
 elif request.method=='POST':
  u=request.POST.get('username','')
  a=request.POST.get('age','')
  g=request.POST.get('gender','')
  c=request.POST.get('cs','')
  models.Students.objects.create(
   username=u,
   age=a,
   gender=g,
   cs_id=c
  )
  return redirect('/students.html')


def del_students(request):
 nid = request.GET.get('nid', '')
 models.Students.objects.filter(id=nid).delete()
 return redirect('/students.html')


def edit_students(request):
 if request.method=="GET":
  nid = request.GET.get('nid', '')
  obj=models.Students.objects.get(id=nid)
  cs_list = models.Classes.objects.all()
  return render(request,'edit_students.html',{'obj':obj,'cs_list':cs_list})
 elif request.method=="POST":
  nid=request.POST.get('nid','')
  u = request.POST.get('username', '')
  a = request.POST.get('age', '')
  g = request.POST.get('gender', '')
  c = request.POST.get('cs', '')
  models.Students.objects.filter(id=nid).update(
   username=u,
   age=a,
   gender=g,
   cs_id=c)
  return redirect('/students.html')

2.在urls.py 中配置url路由: 

from django.contrib import admin
from django.urls import path
from app01.views import classes,students,teachers

urlpatterns = [
 path('admin/', admin.site.urls),

 path('classes.html', classes.get_classes),
 path('add_classes.html', classes.add_classes),
 path('del_classes.html', classes.del_classes),
 path('edit_classes.html', classes.edit_classes),

 path('students.html', students.get_students),
 path('add_students.html', students.add_students),
 path('del_students.html', students.del_students),
 path('edit_students.html', students.edit_students),
 # path('teachers.html', teachers.get_teachers),
]

3.在template目录下建立所需的html页面文件:

get_students.html

<!DOCTYPE html>
<html lang="en">
<head>
 <style>
  tr td{ border:1px solid #000;text-align:center;}
 </style>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<div>
 <table>
  <thead>
   <tr>
    <th>ID</th>
    <th>姓名</th>
    <th>年龄</th>
    <th>性别</th>
    <th>班级</th>
    <th>操作</th>
   </tr>
  </thead>
  <tbody>
   {% for row in stu_list %}
   <tr>
    <td>{{ row.id }}</td>
    <td>{{ row.username }}</td>
    <td>{{ row.age }}</td>
    <td>{{ row.gender }}</td>
    <td>{{ row.cs.title }}</td>
    <td><a href="/del_students.html?nid={{ row.id }}" rel="external nofollow" rel="external nofollow" >删除</a>
     |<a href="/edit_students.html?nid={{ row.id }}" rel="external nofollow" rel="external nofollow" >编辑</a>
    </td>
   </tr>
   {% endfor %}
  </tbody>
 </table>
</div>

<div><a href="/add_students.html" rel="external nofollow" rel="external nofollow" >添加</a> </div>
</body>
</html>

add_students

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post" action="/add_students.html">
 {% csrf_token %}
 <p><input type="text" name="username" placeholder="用户名"></p>
 <p><input type="text" name="age" placeholder="年龄"></p>
 <p>
  男<input type="radio" name="gender" value="1">
  女<input type="radio" name="gender" value="0">
 </p>
 <p>
  <select name="cs">
   {% for row in cs_list %}
   <option value="{{ row.id }}">{{ row.title }}</option>
   {% endfor %}
  </select>
 </p>
 <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

edit_students.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<h1>编辑用户</h1>
<form method="post" action="/edit_students.html">
 {% csrf_token %}
 <input type="hidden" name="nid" value="{{ obj.id }}">
 <p><input type="text" name="username" placeholder="用户名"></p>
 <p><input type="text" name="age" placeholder="年龄"></p>
 <p>
  男<input type="radio" name="gender" value="1">
  女<input type="radio" name="gender" value="0">
 </p>
 <p>
  <select name="cs">
   {% for row in cs_list %}
   <option value="{{ row.id }}">{{ row.title }}</option>
   {% endfor %}
  </select>
 </p>
 <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

7.学员管理系统之给班级分配老师:

在teachers数据表中增加一些老师信息:

在pycharm右上角的Database打开面板,然后将template目录下边的db.splte3鼠标拖入到Database面板中,打开db==》app01_teachers表

点击“+”,然后填入老师信息,然后点击有“DB”标志的向上箭头,进行数据保存。

1.在classes.py中增加set_teachers函数

def set_teachers(request):
 if request.method=='GET':
  nid=request.GET.get('nid','')
  cls_obj=models.Classes.objects.get(id=nid)
  cls_teacher_list=cls_obj.a.all()
  all_teacher_list=models.Teachers.objects.all()
  return render(request,'set_teachers.html',{
   'cls_teacher_list':cls_teacher_list,
   'all_teacher_list':all_teacher_list,
   'nid':nid,
  })
 elif request.method=='POST':
  nid = request.POST.get('nid', '')
  ids_str=request.POST.getlist('teacher_id','')
  ids_int=[]
  for i in ids_str:
   i=int(i)
   ids_int.append(i)
  obj=models.Classes.objects.get(id=nid)
  obj.a.set(ids_int)
  return redirect('/classes.html')

2.在urls.py 中配置url路由: 

from django.contrib import admin
from django.urls import path
from app01.views import classes,students,teachers

urlpatterns = [
 path('admin/', admin.site.urls),

 path('classes.html', classes.get_classes),
 path('add_classes.html', classes.add_classes),
 path('del_classes.html', classes.del_classes),
 path('edit_classes.html', classes.edit_classes),

 path('students.html', students.get_students),
 path('add_students.html', students.add_students),
 path('del_students.html', students.del_students),
 path('edit_students.html', students.edit_students),

 path('set_teachers.html', classes.set_teachers),
]
 

3.在template目录下建立所需的html页面文件:

set_teachers.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<form action="/set_teachers.html" method="post">
 <input type="hidden" name="nid" value="{{ nid }}">
 {% csrf_token %}
 <select multiple size="10" name="teacher_id">

  {% for item in all_teacher_list %}
   {% if item in cls_teacher_list %}
   <option value="{{ item.id }}" selected="selected">{{ item.name }}</option>
   {% else %}
   <option value="{{ item.id }}">{{ item.name }}</option>
   {% endif %}
  {% endfor %}
 </select>
 <input type="submit" value="提交">
</form>
</body>
</html>

对get_classes.html进行增添修改为:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<div>
 <table>
  <thead>
   <tr>
    <th>ID</th> <th>名称</th> <th>任课老师</th> <th>操作</th>
   </tr>
  </thead>
  <tbody>
   {% for row in cls_list %}
   <tr>
    <td>{{ row.id }}</td>
    <td>{{ row.title }}</td>
    <td>
     {% for item in row.a.all %}
      <span>{{ item.name }}</span>
      {% endfor %}
    </td>
    <td><a href="/del_classes.html?nid={{ row.id }}" rel="external nofollow" rel="external nofollow" >删除</a>
     |<a href="/edit_classes.html?nid={{ row.id }}" rel="external nofollow" rel="external nofollow" >编辑</a>
     |<a href="/set_teachers.html?nid={{ row.id }}" rel="external nofollow" >分配老师</a>
    </td>
   </tr>
   {% endfor %}
  </tbody>
 </table>
</div>

<div><a href="/add_classes.html" rel="external nofollow" rel="external nofollow" >添加</a> </div>
</body>
</html>

8.初识Ajax

Ajax是异步传输方式,偷偷的向后台发请求,不引起页面刷新,下面通过一个小例子来认识Ajax这种数据传输方式。

首先下载jQuery导入项目下的static目录下

1.在app01/Views目录下新建ajax.py

from django.shortcuts import render,redirect,HttpResponse


def ajax1(request):
 return render(request,'ajax1.html')


def ajax2(request):
 u=request.GET.get('username')
 p=request.GET.get('password')
 return HttpResponse('我愿意')

2.在urls.py中配置相关路由

from django.contrib import admin
from django.urls import path
from app01.views import classes,students,teachers,ajax

urlpatterns = [
 path('admin/', admin.site.urls),

 path('classes.html', classes.get_classes),
 path('add_classes.html', classes.add_classes),
 path('del_classes.html', classes.del_classes),
 path('edit_classes.html', classes.edit_classes),

 path('students.html', students.get_students),
 path('add_students.html', students.add_students),
 path('del_students.html', students.del_students),
 path('edit_students.html', students.edit_students),

 path('set_teachers.html', classes.set_teachers),

 path('ajax1.html', ajax.ajax1),
 path('ajax2.html', ajax.ajax2),
]

3.在template目录下新建ajax1.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <style>
  .btn{
   display: inline-block;
   padding: 5px 15px;
   background-color: coral;
   color: white;
   cursor: pointer;
  }
 </style>
</head>
<body>
<div>
 <input placeholder="用户名" type="text">
 <input placeholder="密码" type="password">
 <div class="btn">提交</div>
</div>
<script src="/static/jquery-3.3.1.js"></script>
<script>
 function submitForm() {
  var u=$('#username').val();
  var p=$('#password').val();
  $.ajax({
   url:'ajax2.html',
   type:'GET',
   data:{username:u,password:p},
   success:function (arg) {
    //回调函数 arg是服务器返回的字符串
    console.log(arg)
   }

  })

 }
</script>
</body>
</html>

9.学员管理系统之Ajax删除学员: 1.在ajax.py中增加ajax4函数

from app01 import models
def ajax4(request):
 nid=request.GET.get('nid')
 msg='成功'
 try:
  models.Students.objects.get(id=nid).delete()
 except Exception as e:
  msg=str(e)
 return HttpResponse(msg)

2.在urls.py中配置相关路由

from django.contrib import admin
from django.urls import path
from app01.views import classes,students,teachers,ajax

urlpatterns = [
 path('admin/', admin.site.urls),

 path('classes.html', classes.get_classes),
 path('add_classes.html', classes.add_classes),
 path('del_classes.html', classes.del_classes),
 path('edit_classes.html', classes.edit_classes),

 path('students.html', students.get_students),
 path('add_students.html', students.add_students),
 path('del_students.html', students.del_students),
 path('edit_students.html', students.edit_students),

 path('set_teachers.html', classes.set_teachers),

 path('ajax1.html', ajax.ajax1),
 path('ajax2.html', ajax.ajax2),
 path('ajax4.html', ajax.ajax4),
]

3.对get_students.html进行添加修改:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<div>
 <table>
  <thead>
   <tr>
    <th>ID</th>
    <th>姓名</th>
    <th>年龄</th>
    <th>性别</th>
    <th>班级</th>
    <th>操作</th>
   </tr>
  </thead>
  <tbody>
   {% for row in stu_list %}
   <tr nid="{{ row.id }}">
    <td>{{ row.id }}</td>
    <td>{{ row.username }}</td>
    <td>{{ row.age }}</td>
    <td>{{ row.gender }}</td>
    <td>{{ row.cs.title }}</td>
    <td><a href="/del_students.html?nid={{ row.id }}" rel="external nofollow" rel="external nofollow" >删除</a>
     |<a href="#" rel="external nofollow" >Ajax删除</a>
     |<a href="/edit_students.html?nid={{ row.id }}" rel="external nofollow" rel="external nofollow" >编辑</a>
    </td>
   </tr>
   {% endfor %}
  </tbody>
 </table>
</div>

<div><a href="/add_students.html" rel="external nofollow" rel="external nofollow" >添加</a> </div>
</body>
<script src="/static/jquery-3.3.1.js"></script>
<script>
 function removeStudent(ths) {
  var nid=$(ths).parent().parent().attr('nid');
  $.ajax({
   url:'/ajax4.html',
   type:'GET',
   data:{nid:nid},
   success:function (arg) {
    if (arg=='成功'){
     window.location.reload();
    }else{
     alert(arg);
    }
   }
  })
 }
</script>
</html>
Python 相关文章推荐
Python实现的一个找零钱的小程序代码分享
Aug 25 Python
Python深入学习之闭包
Aug 31 Python
Python开发常用的一些开源Package分享
Feb 14 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
python数据挖掘需要学的内容
Jun 23 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
Python中itertools的用法详解
Feb 07 Python
Python基于Socket实现简单聊天室
Feb 17 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
Dec 09 Python
Autopep8的使用(python自动编排工具)
Mar 02 Python
python爬虫面试宝典(常见问题)
Mar 02 #Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 #Python
谈谈python中GUI的选择
Mar 01 #Python
纯python实现机器学习之kNN算法示例
Mar 01 #Python
用python与文件进行交互的方法
Mar 01 #Python
python爬虫爬取快手视频多线程下载功能
Feb 28 #Python
python爬取m3u8连接的视频
Feb 28 #Python
You might like
php Smarty模板生成html文档的方法
2010/04/12 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
linux 下实现python多版本安装实践
2014/11/18 Python
python dlib人脸识别代码实例
2019/04/04 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python切图九宫格的实现方法
2019/10/10 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
物业门卫岗位职责
2013/12/28 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
艺术教育实施方案
2014/05/03 职场文书
超市创意活动方案
2014/08/15 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers