系统定制开发Python课程设计

Python课程设计(ZZU结课作业)

系统定制开发基础版源码:

系统定制开发进阶版源码:

系统定制开发源码配合目录4使用,执行完4系统定制开发流程后记得在db_user系统定制开发表中添加一条数据,系统定制开发否则无法登录(系统定制开发无管理员数据)

前提:

  • 熟悉html基本元素
  • 了解jquery(系统定制开发基础版源码不需要,系统定制开发进阶版会用到ajax,需要jquery知识
  • 熟悉mysql的使用
  • 安装了Django,了解Django基本语法

系统定制开发因为是院选修课,系统定制开发所以不准备写的很好,系统定制开发需要三张表(user,department,student),目录3,4系统定制开发中有以及生成表的步骤

功能:

  • 登录功能
  • 对department系统定制开发表即院系系统定制开发表的增删改查
  • 对student表的增删改查

系统定制开发单个表的增删改查步骤是相同的,系统定制开发那么为什么不只用department系统定制开发一张表来实现增删改查呢?

其实在student表中有depart_id系统定制开发字段是外键,系统定制开发我想练习一下python的,有其他需要的也可以自行完善

1、新建项目

删除templates目录和默认资源路径

2、创建app

startapp +app名字
  • 1

新建的项目必须注册

3、设计表结构

建表,在models.py中

class User(models.Model):    """用户表"""    id = models.BigAutoField(verbose_name="ID", primary_key=True)    username = models.CharField(verbose_name="用户名", max_length=30)  # varchar(32)    password = models.CharField(verbose_name="密码", max_length=30)  # varchar(32)class Department(models.Model):    """院系表"""    id = models.BigAutoField(verbose_name="ID", primary_key=True)    title = models.CharField(verbose_name="院系名", max_length=32)class Student(models.Model):    """学生表"""    id = models.BigIntegerField(verbose_name="学号", primary_key=True)    name = models.CharField(verbose_name="姓名", max_length=15)    age = models.IntegerField(verbose_name="年龄")    address = models.CharField(verbose_name="住址", max_length=50)    account = models.DecimalField(verbose_name="校园卡余额", max_length=10, decimal_places=2, default=0)    time = models.DateTimeField(verbose_name="注册时间")    # 外键,删除置NULL,生成字段时会自动取名叫depart_id    depart = models.ForeignKey(verbose_name="所属院系", to="Department", to_field="id", null=True, blank=True, on_delete=models.SET_NULL)    # 在Django做的约束    gender_choices = (        (1, "男"),        (2, "女"),    )    gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

4、在Mysql中生成表

  • 在Mysql生成数据库
create database 数据库名字 ......	# 我是用navicat建的表,注意编码格式
  • 1
  • 修改配置文件settings.py,连接数据库
DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'python',   # 数据库名字        'USER': 'root',        'PASSWORD': 'root',        'HOST': '127.0.0.1',        'PORT': '3306',    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  • 通过Django命令生成表

在终端输入命令

makemigrationsmigrate
  • 1
  • 2

表创建成功

5、静态资源

6、院系管理

Bootstrap官网:https://www.bootcss.com/

来这里找自己喜欢的风格页面

在html中引入css,js

<!--头部引入--><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous"><!--尾部引入--><script src="{% static 'js/jquery.min.js' %}"></script><script src="{% static 'js/bootstrap.js' %}"></script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

6.1、院系列表

配置路由

path('depart/list/', views.depart_list),
  • 1

编写函数

def depart_list(request):    return render(request, "depart_list.html")
  • 1
  • 2

创建页面

depart_list.html

{% load static %}<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>院系列表</title>    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">    <style>        .navbar {            border-radius: 0;        }    </style></head><body>    <!--顶部菜单-->    <nav class="navbar navbar-default">      <div class="container">        <div class="navbar-header">          <a class="navbar-brand" href="#">ZZU学生管理系统</a>        </div>        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">          <ul class="nav navbar-nav">            <li><a href="/depart/list">院系管理</a></li>            <li><a href="/depart/list">学生管理</a></li>          </ul>          <ul class="nav navbar-nav navbar-right">            <li class="dropdown">              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">管理员 <span class="caret"></span></a>              <ul class="dropdown-menu">                <li><a href="#">个人信息</a></li>                <li role="separator" class="divider"></li>                <li><a href="#">注销</a></li>              </ul>            </li>          </ul>        </div>      </div>    </nav>    <!--中间表格-->    <div>        <div class="container">            <div style="margin-bottom: 10px">                <h4>                     <a class="btn-success" href="">                        <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>                        添加院系                    </a>                </h4>            </div>            <div>                <div class="panel panel-default">                    <!--面板头-->                    <div class="panel-heading">                        <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>                        院系列表                    </div>                    <!--数据区域-->                    <table class="table table-bordered">                        <thead>                          <tr>                            <th>院系序号</th>                            <th>院系名称</th>                            <th>操作</th>                          </tr>                        </thead>                        <tbody>                          <tr>                            <td>1</td>                            <td>机械学院</td>                            <td>                                <a class="btn btn-primary btn-xs" href="">编辑</a>                                <a class="btn btn-danger btn-xs" href="">删除</a>                            </td>                          </tr>                        </tbody>                </table>                </div>            </div>        </div>    </div><script src="{% static 'js/jquery.min.js' %}"></script><script src="{% static 'js/bootstrap.js' %}"></script></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

接下来去数据库里取数据

def depart_list(request):    # 查询结果是一个列表,每个元素是一个对象,类似java的List<Class>    departs = models.Department.objects.all()    return render(request, "depart_list.html", {"departs": departs})
  • 1
  • 2
  • 3
  • 4
  • 5

前端接收并进行遍历

<tbody>    {% for depart in departs %}    <tr>        <th>{{ depart.id }}</th>        <td>{{ depart.title }}</td>        <td>            <a class="btn btn-primary btn-xs" href="">编辑</a>            <a class="btn btn-danger btn-xs" href="">删除</a>        </td>    </tr>    {% endfor %}</tbody>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

6.2、添加院系

配置depart_list.html中添加院系按钮的目的地址

<a class="btn-success" href="/depart/add/">    <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>    添加院系</a>
  • 1
  • 2
  • 3
  • 4

去urls.py中注册

path('depart/add/', views.depart_add),
  • 1

在views.py中写接收函数

@csrf_exempt	# 添加这个注解就不需要在form表单里写csrf_tokendef depart_add(request):    if request.method == "GET":	# 如果是get请求,进入新增界面        return render(request, "depart_add.html")	# 否则,添加到数据库中    title = request.POST.get("title")    models.Department.objects.create(title=title)    return redirect("/depart/list/")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

编写depart_add.html

{% load static %}<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>新增院系</title>    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">    <style>        .navbar {            border-radius: 0;        }    </style></head><body>    <!--顶部菜单-->    <nav class="navbar navbar-default">      <div class="container">        <div class="navbar-header">          <a class="navbar-brand" href="#">ZZU学生管理系统</a>        </div>        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">          <ul class="nav navbar-nav">            <li><a href="/depart/list">院系管理</a></li>            <li><a href="/depart/list">学生管理</a></li>          </ul>          <ul class="nav navbar-nav navbar-right">            <li class="dropdown">              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">管理员 <span class="caret"></span></a>              <ul class="dropdown-menu">                <li><a href="#">个人信息</a></li>                <li role="separator" class="divider"></li>                <li><a href="#">注销</a></li>              </ul>            </li>          </ul>        </div>      </div>    </nav>    <div>        <div class="container">            <div class="panel panel-default">              <div class="panel-heading">                <h3 class="panel-title">新增院系</h3>              </div>              <div class="panel-body">                  <form method="post">                      <div class="form-group">                          <label>院系名称</label>                          <input type="text" id="title" name="title" class="form-control" placeholder="院系名" required="">                      </div>                      <button type="submit" class="btn btn-primary">提 交</button>                  </form>              </div>            </div>        </div>    </div><script src="{% static 'js/jquery.min.js' %}"></script><script src="{% static 'js/bootstrap.js' %}"></script></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

6.3、删除院系

depart_list.html中设置href–>urls.py中配置路径与函数的映射–>编写对应函数

<a class="btn btn-danger btn-xs" href="/depart/delete/?did={{ depart.id }}">删除</a>
  • 1
path('depart/delete/', views.depart_delete),
  • 1
def depart_delete(request):    did = request.GET.get("did")    models.Department.objects.filter(id=did).delete()    return redirect("/depart/list/")
  • 1
  • 2
  • 3
  • 4

6.4、编辑院系

这里默认院系名是唯一的!

depart_list.html中设置href–>urls.py中配置路径与函数的映射–>编写对应函数

<a class="btn btn-primary btn-xs" href="/depart/update/?did={{ depart.id }}">编辑</a>
  • 1
path('depart/update/', views.depart_update),
  • 1
@csrf_exemptdef depart_update(request):    if request.method == "GET":	# 如果是get请求,获取该院系的did,查找该院系,返给update页面        did = request.GET.get("did")        depart = models.Department.objects.get(id=did)        return render(request, "depart_update.html", {"depart": depart})    # 如果是post请求,代表是更新,通过filter查找到该条数据,更新title    did = request.POST.get("did")	    title = request.POST.get("title")    models.Department.objects.filter(id=did).update(title=title)    return redirect("/depart/list/")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

depart_html页面

{% load static %}<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>院系列表</title>    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">    <style>        .navbar {            border-radius: 0;        }    </style></head><body>    <!--顶部菜单-->    <nav class="navbar navbar-default">      <div class="container">        <div class="navbar-header">          <a class="navbar-brand" href="#">ZZU学生管理系统</a>        </div>        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">          <ul class="nav navbar-nav">            <li><a href="/depart/list">院系管理</a></li>            <li><a href="/depart/list">学生管理</a></li>          </ul>          <ul class="nav navbar-nav navbar-right">            <li class="dropdown">              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">管理员 <span class="caret"></span></a>              <ul class="dropdown-menu">                <li><a href="#">个人信息</a></li>                <li role="separator" class="divider"></li>                <li><a href="#">注销</a></li>              </ul>            </li>          </ul>        </div>      </div>    </nav>    <!--中间表格-->    <div>        <div class="container">            <div style="margin-bottom: 10px">                <h4>                     <a class="btn-success" href="/depart/add/">                        <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>                        添加院系                    </a>                </h4>            </div>            <div>                <div class="panel panel-default">                    <!--面板头-->                    <div class="panel-heading">                        <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>                        院系列表                    </div>                    <!--数据区域-->                    <table class="table table-bordered">                        <thead>                          <tr>                            <th>院系序号</th>                            <th>院系名称</th>                            <th>操作</th>                          </tr>                        </thead>                        <tbody>                            {% for depart in departs %}                              <tr>                                <th>{{ depart.id }}</th>                                <td>{{ depart.title }}</td>                                <td>                                    <a class="btn btn-primary btn-xs" href="/depart/update/?did={{ depart.id }}">编辑</a>                                    <a class="btn btn-danger btn-xs" href="/depart/delete/?did={{ depart.id }}">删除</a>                                </td>                              </tr>                            {% endfor %}                        </tbody>                </table>                </div>            </div>        </div>    </div><script src="{% static 'js/jquery.min.js' %}"></script><script src="{% static 'js/bootstrap.js' %}"></script></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90

7、页面优化

我们可以发现,在院系管理的三个页面中,我们只改变了中间的部分,其中顶部导航栏和底部引入的js等都没有发生变化

那么,有没有一种方法可以抽取出这些公共部分,在新页面中只写需要的部分呢?

模版继承

写一个layout.html

{% load static %}<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>院系列表</title>    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">    {% block css %} {% endblock %}    <style>        .navbar {            border-radius: 0;        }    </style></head><body>    <!--顶部菜单-->    <nav class="navbar navbar-default">      <div class="container">        <div class="navbar-header">          <a class="navbar-brand" href="">ZZU学生管理系统</a>        </div>        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">          <ul class="nav navbar-nav">            <li><a href="/depart/list">院系管理</a></li>            <li><a href="/stu/list">学生管理</a></li>          </ul>          <ul class="nav navbar-nav navbar-right">            <li class="dropdown">              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">管理员 <span class="caret"></span></a>              <ul class="dropdown-menu">                <li><a href="#">个人信息</a></li>                <li role="separator" class="divider"></li>                <li><a href="#">注销</a></li>              </ul>            </li>          </ul>        </div>      </div>    </nav>    <!--中间表格-->    <div>        {% block content %} {% endblock %}    </div>    {% block js %} {% endblock %}    <script src="{% static 'js/jquery.min.js' %}"></script>    <script src="{% static 'js/bootstrap.js' %}"></script></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

其中 {% block *** %} {% endblock %}可以理解为占位符,其他页面只需继承该页面并完成block内的内容即可

depart_list.html

{% extends "layout.html" %}    {% block content %}        <div class="container">            <div style="margin-bottom: 10px">                <h4>                     <a class="btn-success" href="/depart/add/">                        <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>                        添加院系                    </a>                </h4>            </div>            <div>                <div class="panel panel-default">                    <!--面板头-->                    <div class="panel-heading">                        <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>                        院系列表                    </div>                    <!--数据区域-->                    <table class="table table-bordered">                        <thead>                          <tr>                            <th>院系序号</th>                            <th>院系名称</th>                            <th>操作</th>                          </tr>                        </thead>                        <tbody>                            {% for depart in departs %}                              <tr>                                <td>{{ depart.id }}</td>                                <td>{{ depart.title }}</td>                                <td>                                    <a class="btn btn-primary btn-xs" href="/depart/update/?did={{ depart.id }}">编辑</a>                                    <a class="btn btn-danger btn-xs" href="/depart/delete/?did={{ depart.id }}">删除</a>                                </td>                              </tr>                            {% endfor %}                        </tbody>                </table>                </div>            </div>        </div>    {% endblock %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

depart_add.html

{% extends "layout.html" %}    {% block content %}        <div class="container">            <div class="panel panel-default">              <div class="panel-heading">                <h3 class="panel-title">新增院系</h3>              </div>              <div class="panel-body">                  <form method="post">                      <div class="form-group">                          <label>院系名称</label>                          <input type="text" id="title" name="title" class="form-control" placeholder="院系名" required="">                      </div>                      <button type="submit" class="btn btn-primary">提 交</button>                  </form>              </div>            </div>        </div>    {% endblock %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

depart_update.html

{% extends "layout.html" %}    {% block content %}        <div class="container">            <div class="panel panel-default">              <div class="panel-heading">                <h3 class="panel-title">编辑院系</h3>              </div>              <div class="panel-body">                  <form method="post">                      <div class="form-group">                          <label>院系编号</label>                          <input type="text" name="did" class="form-control" placeholder="院系名" value="{{ depart.id }}" readonly="readonly">                      </div>                      <div class="form-group">                          <label>院系名称</label>                          <input type="text" id="title" name="title" class="form-control" placeholder="院系名" value="{{ depart.title }}" required="">                      </div>                      <button type="submit" class="btn btn-primary">提 交</button>                  </form>              </div>            </div>        </div>    {% endblock %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

院系管理至此基本结束,其中增加部分和编辑部分做的不完善,应该获取提交的院系名(title)后,进行判断该新院系名是否已经存在。若存在则新增或修改失败,反之成功!没有查找功能是出于对实际生活中院系数量通常较少的考虑。

8、学生管理

8.1、学生列表

注册url–>编写函数–>编写页面

path('stu/list/', views.stu_list),
  • 1
def stu_list(request):    # 查询结果是一个列表,每个元素是一个对象,类似java的List<Class>    students = models.Student.objects.all()    return render(request, "stu_list.html", {"students": students})
  • 1
  • 2
  • 3
  • 4
{% extends "layout.html" %}    {% block content %}        <div class="container">            <div style="margin-bottom: 10px">                <h4>                     <a class="btn-success" href="/stu/add/">                        <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>                        添加学生                    </a>                </h4>            </div>            <div>                <div class="panel panel-default">                    <!--面板头-->                    <div class="panel-heading">                        <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>                        学生列表                    </div>                    <!--数据区域-->                    <table class="table table-bordered">                        <thead>                          <tr>                            <th>学号</th>                            <th>姓名</th>                            <th>性别</th>                            <th>年龄</th>                            <th>住址</th>                            <th>校园卡余额</th>                            <th>入学时间</th>                            <th>所属院系</th>                            <th>操作</th>                          </tr>                        </thead>                        <tbody>                            {% for student in students %}                              <tr>                                <td>{{ student.id }}</td>                                <td>{{ student.name }}</td>                                <td>{{ student.get_gender_display}}</td>                                <td>{{ student.age }}</td>                                <td>{{ student.address }}</td>                                <td>{{ student.account }}</td>                                <td>{{ student.time|date:"Y-m-d"}}</td>                                <td>{{ student.depart.title}}</td>                                <td>                                    <a class="btn btn-primary btn-xs" href="/stu/update/?sid={{ student.id }}">编辑</a>                                    <a class="btn btn-danger btn-xs" href="/stu/delete/?sid={{ student.id }}">删除</a>                                </td>                              </tr>                            {% endfor %}                        </tbody>                </table>                </div>            </div>        </div>    {% endblock %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

8.2、添加学生

这次我们使用ModelForm开发,前端十分简便!

注册url–>编写函数–>编写页面

path('stu/add/', views.stu_add),
  • 1
from django import formsclass StudentModelForm(forms.ModelForm):    id = forms.CharField(max_length=12, min_length=12, label="学号")    class Meta:        model = models.Student        fields = ["id", "name", "gender", "age", "address", "account", "time", "depart"]    def __init__(self, *args, **kwargs):        super().__init__(*args, **kwargs)        for name, field in self.fields.items():            if name == "gender":                continue            field.widget.attrs = {'class': 'form-control', "placeholder": field.label}@csrf_exemptdef stu_add(request):    if request.method == "GET":        form = StudentModelForm()        return render(request, "stu_add.html", {"form": form})    # 用户POST提交数据,需要进行校验    form = StudentModelForm(data=request.POST)    if form.is_valid():        form.save()        return redirect("/stu/list/")    else:        return render(request, "stu_add.html", {"form": form})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
{% extends "layout.html" %}    {% block content %}        <div class="container">            <div class="panel panel-default">              <div class="panel-heading">                <h3 class="panel-title">新增学生</h3>              </div>              <div class="panel-body">                  <form method="post" novalidate>                      {% for item in form %}                          <div class="form-group">                              <label>{{ item.label }}</label>                              {{ item }}                          <span style="color: red">{{ item.errors.0 }}</span>                          </div>                      {% endfor %}                      <button type="submit" class="btn btn-primary">提 交</button>                  </form>              </div>            </div>        </div>    {% endblock %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

去settings.py中修改默认语言为中文

LANGUAGE_CODE = 'zh-hans'
  • 1

8.3、删除学生

同删除院系,只需要把/depart修改为/stu即可

8.4、编辑学生

注册url–>编写函数–>编写页面

path('stu/update/', views.stu_update),
  • 1
@csrf_exemptdef stu_update(request):    if request.method == "GET":        sid = request.GET.get("sid")        context = {            'gender_choices': models.Student.gender_choices,            'departs': models.Department.objects.all(),            'student': models.Student.objects.get(id=sid)        }        return render(request, "stu_update.html", context)    sid = request.POST.get("sid")    name = request.POST.get("name")    gender = request.POST.get("gender")    depart = request.POST.get("depart")    models.Student.objects.filter(id=sid).update(name=name,gender=gender,depart=depart)    return redirect("/stu/list/")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
{% extends "layout.html" %}    {% block content %}        <div class="container">            <div class="panel panel-default">              <div class="panel-heading">                <h3 class="panel-title">编辑院系</h3>              </div>              <div class="panel-body">                  <form method="post">                      <div class="form-group">                          <label>学号</label>                          <input type="text" name="sid" class="form-control" value="{{ student.id }}" readonly="readonly">                      </div>                      <div class="form-group">                          <label>姓名</label>                          <input type="text" id="name" name="name" class="form-control" value="{{ student.name }}" required="">                      </div>                      <div class="form-group">                          <label>性别:</label>                          <select name="gender" id="gender">                              {% for item in gender_choices %}                                  {% if item.0  ==  student.gender %}                                    <option selected value="{{ item.0 }}">{{ item.1 }}</option>                                  {% else %}                                    <option value="{{ item.0 }}">{{ item.1 }}</option>                                  {% endif %}                              {% endfor %}                          </select>                      </div>                      <div class="form-group">                          <label>院系</label>                          <select class="form-control" id="depart" name="depart">                              {% for depart in departs %}                                  {% if depart.id == student.depart.id %}                                    <option selected value="{{ depart.id }}">{{ depart.title }}</option>                                  {% else %}                                    <option value="{{ depart.id }}">{{ depart.title }}</option>                                  {% endif %}                              {% endfor %}                          </select>                      </div>                      <button type="submit" class="btn btn-primary">提 交</button>                  </form>              </div>            </div>        </div>    {% endblock %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

8.5、查找学生

修改stu_list页面,增加搜索表单

<form method="post">    <input type="text" name="sid" placeholder="请输入学号" style="margin-left: 2px; margin-bottom: 2px; margin-top: 2px" required="">    <button type="submit">查询</button></form>
  • 1
  • 2
  • 3
  • 4

在stu_list函数里增加查询功能

@csrf_exemptdef stu_list(request):    if request.method == "GET":        students = models.Student.objects.all()        return render(request, "stu_list.html", {"students": students})    sid = request.POST.get("sid")    students = models.Student.objects.filter(id=sid)    return render(request, "stu_list.html", {"students": students})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

9、登录功能

配置url–>编写函数–>完成页面

path('user/login/', views.user_login),
  • 1
@csrf_exemptdef user_login(request):    if request.method == "GET":        return render(request, "user_login.html")    try:        user = models.User.objects.get(username=request.POST.get("username"), password=request.POST.get("password"))    except models.User.DoesNotExist:        user = None    if user is not None:        return redirect("/depart/list")    msg = "用户名或密码错误!"    return render(request, "user_login.html",{"msg": msg})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

user_login.html

{% load static %}<!DOCTYPE html><html lang="en"><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">    <meta name="description" content="">    <meta name="author" content="">    <title>登录</title>    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">    <link href="{% static 'css/signin.css' %}" rel="stylesheet"></head><body class="text-center">    <form class="form-signin" method="post">        <img class="mb-4" src="{% static 'img/zzu.svg' %}" alt="" width="300" height="250">        <p style="color: red">{{ msg }}</p>        <input type="text" id="username" name="username" class="form-control" placeholder="用户名" required="" autofocus="">        <br>        <input type="password" id="password" name="password" class="form-control" placeholder="密码" required="">        <div style="margin-top: 30px">            <button style="width: 60%; border: none; background-color: dodgerblue; color: white; font-size: 16px;                 box-sizing: content-box; padding: 10px; cursor: pointer" type="submit">                登录            </button>            <p class="mt-5 mb-3 text-muted">© 2022-10-29</p>        </div>    </form></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

至此,已经完成了这个项目的基础版!

10、进阶,结合ajax

可以发现,我们在登录、编辑等任何需要提交表单的地方,一旦提交,页面就会自动刷新,我们之前填写的数据就都不见了!

这是同步提交,对用户的体验是极差的

Ajax,异步提交

  • 前端把数据提交到后端,后端接收数据进行判断
  • 后端判断完成后返还给前端包含有对前端提交是否正确的result,前端通过result来判断是否会进行跳转!

修改登录功能

def user_login

from django.http import JsonResponse@csrf_exemptdef user_login(request):    if request.method == "GET":        return render(request, "user_login.html")    try:        user = models.User.objects.get(username=request.POST.get("username"), password=request.POST.get("password"))    except models.User.DoesNotExist:        user = None    if user is not None:        return JsonResponse({"code": True, "msg": "登录成功!"})    return JsonResponse({"code": False, "msg": "用户名或密码错误!"})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

user_login.html

{% load static %}<!DOCTYPE html><html lang="en"><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">    <meta name="description" content="">    <meta name="author" content="">    <title>登录</title>    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">    <link href="{% static 'css/signin.css' %}" rel="stylesheet"></head><body class="text-center">    <div class="form-signin">        <img class="mb-4" src="{% static 'img/zzu.svg'%}" alt="" width="300" height="250">        <input type="text" id="username" name="username" class="form-control" placeholder="用户名" required="" autofocus="">        <br>        <input type="password" id="password" name="password" class="form-control" placeholder="密码" required="">        <div style="margin-top: 30px">            <button style="width: 60%; border: none; background-color: dodgerblue; color: white; font-size: 16px;                 box-sizing: content-box; padding: 10px; cursor: pointer" onclick="login()">                登录            </button>            <p class="mt-5 mb-3 text-muted">© 2022-10-29</p>        </div>    </div>    <script src="{% static "js/jquery.min.js" %}"></script>    <script type="text/javascript">        function login() {            $.ajax({                type: "POST",                url: "/user/login/",                data:{'username':$("#username").val(), 'password':$("#password").val()},                success: (res) => {                    if (res.code) {                        alert("欢迎使用!")                        location.href = "/depart/list";                    } else {                        alert("账号或密码错误!")                    }                }            })        }    </script></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

实际上,任何涉及表单提交的地方都可以转为ajax,有需要的可以自行对比完善!

11、结语

我个人主要是学习java方向的,所以就从之前用java来完成同样的一个系统的方面来对比

1.代码方面,python更加简单,也不像java那样繁琐,java中需要controller层调用service层,service层调用mapper层,层级结构比较多,虽然易维护,但比较繁琐,优点是面向切面编程,易维护核心部分。java中我通常用mybatis和mybatis-plus来做持久层,所以相比刚接触的Django来说,我个人更喜欢mybatis的一对多、多对一、动态sql,但Django操作确实更加简单。

2.功能方面我有很多都没做,比如拦截器,过滤器,验证码,分页这些基础功能。这些在实际生产中是一定要有的,Spring提供了完整的一系列组件来解决,我相信python也一定能实现这样的功能,而且一定会比java更简洁!只是我对python的学习十分浅显,也只是为了完成结课作业,因此不再进行完善。

Django确实有很多优点,例如在性别转换那里1男2女,可以通过Django自己的约束来实现,从而不必在前端进行if的判断,在某些时候甚至可以少写表!在外键联表查询那里,depart可以直接封装院系对象。写过mybatis多对一、一对多映射的人应该更能体会到它的强大!

KaTeX parse error: Expected '}', got 'EOF' at end of input: …ta:{'username':(“#username”).val(), ‘password’😒(“#password”).val()},
success: (res) => {
if (res.code) {
alert(“欢迎使用!”)
location.href = “/depart/list”;
} else {
alert(“账号或密码错误!”)
}
}
})
}

```

实际上,任何涉及表单提交的地方都可以转为ajax,有需要的可以自行对比完善!

11、结语

我个人主要是学习java方向的,所以就从之前用java来完成同样的一个系统的方面来对比

1.代码方面,python更加简单,也不像java那样繁琐,java中需要controller层调用service层,service层调用mapper层,层级结构比较多,虽然易维护,但比较繁琐,优点是面向切面编程,易维护核心部分。java中我通常用mybatis和mybatis-plus来做持久层,所以相比刚接触的Django来说,我个人更喜欢mybatis的一对多、多对一、动态sql,但Django操作确实更加简单。

2.功能方面我有很多都没做,比如拦截器,过滤器,验证码,分页这些基础功能。这些在实际生产中是一定要有的,Spring提供了完整的一系列组件来解决,我相信python也一定能实现这样的功能,而且一定会比java更简洁!只是我对python的学习十分浅显,也只是为了完成结课作业,因此不再进行完善。

Django确实有很多优点,例如在性别转换那里1男2女,可以通过Django自己的约束来实现,从而不必在前端进行if的判断,在某些时候甚至可以少写表!在外键联表查询那里,depart可以直接封装院系对象。写过mybatis多对一、一对多映射的人应该更能体会到它的强大!

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发