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 元类使用说明
Dec 18 Python
在python的WEB框架Flask中使用多个配置文件的解决方法
Apr 18 Python
Python学习笔记_数据排序方法
May 22 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
python代码过长的换行方法
Jul 19 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 Python
django中related_name的用法说明
May 20 Python
Python 远程开关机的方法
Nov 18 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 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简单获取目录列表的方法
2015/03/24 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
JavaScript 事件参考手册
2008/12/24 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
Python import自定义模块方法
2015/02/12 Python
python中函数传参详解
2016/07/03 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
python实现人脸签到系统
2020/04/13 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
详解Django配置JWT认证方式
2020/05/09 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
Java面试题及答案
2012/09/08 面试题
商务日语毕业生自荐信范文
2013/11/14 职场文书
关于旅游的活动方案
2014/08/15 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
初婚未育证明样本
2015/06/18 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
2019秋季运动会口号
2019/06/25 职场文书