[Python+Django]Web学生信息管理系统数据库设计及系统实现

news2024/11/17 13:34:45

本文我们完成数据的设计,并通过Django框架完成数据库构建同时利用Django框架模式实现学生信息管理系统的功能。

简单的包装下毕设应该没问题了。

Python,Mysql,Pycharm的安装本文就不做特别介绍了,有需要的同学请参考如下博文。

Python + Django4 搭建个人博客(二):准备开发环境_李威威wiwi的博客-CSDN博客_django 4 用什么idehttps://blog.csdn.net/agelee/article/details/126406215

 最终实现系统功能结构如下

 源码下载如下:

[Python+Django]Web学生信息管理系统毕业设计之数据库及系统实现源码-Python文档类资源-CSDN文库icon-default.png?t=MBR7https://download.csdn.net/download/agelee/87384620

系统代码文件结构:

 各模块系统运行演示:

学院管理

专业管理:

 

 班级管理:

学生管理

 教师管理

 成绩管理:

 数据库设计:

本系统根据我们的系统分析设计如下7个数据表。

 

 

 

 系统代码实现

大致理清了我们需要实现的功能模块之后,我们开始撸代码

1 、开发环境搭建及技术选型

服务端:Python 3.9

Web框架:Django 4.1.3

数据库:MySQL mysql-8.0.13-winx64

开发工具IDE:Pycharm

前端框架:Bootstrap 4

2、Django项目创建及数据库连接配置

1.在任意盘符文件夹下新建一个空白Pycharm项目文件夹比如:PycharmProjects

2.打开Pycharm,进入空白文件夹:PycharmProjects

3.通过Pycharm 的Windows 命令行输入界面输入创建Django项目的命令,创建一个新的项目:DjangoSms

django-admin startproject DjangoSms

3、 数据库创建和连接配置
Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 为这些数据库提供了统一的调用API。

我们可以根据自己业务需求选择不同的数据库。

MySQL 是 Web 应用中最常用的数据库。

本文采用MySQL。

  •  数据库创建

Django只能操作到数据表级别,不能操作到数据库级别,所以需要手工创建一个数据库:djangosms

我们可以通过命令行创建一个数据库:

1.进入mysql安装文件夹的bin 子文件夹目录:

比如:D:\Program Files\mysql-8.0.13-winx64\bin

2.连接数据库:

mysql -u root -p Enter password:******

3.连接登录成功后通过命令创建一个数据库:djangosms

CREATE DATABASE IF NOT EXISTS djangosms DEFAULT CHARSET utf8;

或者通过SQLlog工具创建一个数据库: djangosms

  • Django数据库连接配置

Django使用MySQL需要mysql 驱动,如果你没安装 mysql 驱动,可以执行以下命令安装:

pip install pymysql

安装好之后, 进入DjangoSms 项目下的DjangoSms 文件夹,打开setting.py 文件,找到DATABASES配置项,修改DATABSES配置项为如下内容:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'djangosms', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
        'PORT': 3306, # 端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }
}

然后使用 pymysql 模块连接 mysql 数据库:

在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置:

import pymysql

pymysql.install_as_MySQLdb()

至此,我们创建了一个Django项目DjangoSms用于我们后续系统开发的程序编写。

同时为此项目创建了一个MySQL数据库:djangosms用于我们程序开发过程中的数据存放和处理。

3 功能模块详细开发

一个Django项目框架搭建起来后,我们所有对系统的前后台所有的程序开发都可以在这个项目中进行了,一个典型的Django项目模块功能的开发包括如下几个步骤:

  • 创建,注册app
  • 定义模型
  • 定义视图函数
  • 配置访问路由URL
  • 静态资源准备及配置
  • 前端模板开发
  • 测试及运行

 1.创建App

在Django中的一个app代表一个功能模块,

本来一般实际开发中方便管理一个功能模块需要单独新建一个app,我们为了快速开发,所有的功能和模型都在一个app中进行管理。

在命令行中输入python manage.py startapp app01指令,创建名为app01的app:

python manage.py startapp app01

在 DjangoSms文件夹目录下的settings.py 中找到INSTALLED_APPS配置项,将新创建的app01添加到项目的app列表,如下:

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01'  #添加此项
]

2.定义模型

Django通过模型将程序中的字段和数据库对应起来,同时在程序和数据中间来传递数据。

Django 模型使用自带的 ORM。

我们之前创建了一个空白的数据库djangoesms,这一步我们通过Django的模型来完成数据库表的创建.

因为Django对模型和目标数据库之间有自身的映射规则,如果自己在数据库中创建数据表,可能不一定符合Django的建表规则,从而导致模型和目标数据库无法建立通信联系。

所以最好我们在Django项目中还是通过Django模型来创建对应数据库表

一个表对应一个模型,本步骤按照我们前面数据库设计需要设计7个模型:

 打开DjangoSms/app01/models.py,建立7个模型:

from django.db import models

# Create your models here.

# 学院表
class Academy(models.Model):
    id = models.AutoField('序号',primary_key=True)
    name = models.CharField('学院',max_length=20)

    # 修改显示的表的名字
    class Meta:
        verbose_name = '学院'
        verbose_name_plural = '学院'

    def __str__(self):
        return self.name


# 专业表
class Major(models.Model):
    id = models.AutoField('序号',primary_key=True)
    academy = models.ForeignKey(to=Academy,on_delete=models.CASCADE,verbose_name='学院')
    name = models.CharField('专业',max_length=30)

    # 修改显示的表的名字
    class Meta:
        verbose_name = '专业'
        verbose_name_plural = '专业'
    def __str__(self):
        return self.name

# 课程表
class Course(models.Model):
    id = models.AutoField('序号',primary_key=True)
    name = models.CharField('课程名称',max_length=30)
    subject = models.CharField('学科',max_length=30)

    class Meta:
        verbose_name = '课程'
        verbose_name_plural = '课程'

    def __str__(self):
        return self.name

# 班级表
class Classx(models.Model):
    id = models.AutoField('序号',primary_key=True)
    major = models.ForeignKey(Major,on_delete=models.CASCADE,verbose_name='专业')
    name = models.CharField('名称',max_length=30)

    # 修改显示的表的名字
    class Meta:
        verbose_name = '专业'
        verbose_name_plural = '专业'
    def __str__(self):
        return self.name

# 学生表
class Student(models.Model):
    id = models.AutoField('序号',primary_key=True)
    sid = models.CharField('学号',max_length=12)
    name = models.CharField('姓名',max_length=20,unique=True)
    sex = models.BooleanField('性别',choices=((0,'女'),(1,'男')))
    age = models.IntegerField('年龄')
    sclass = models.ForeignKey(Classx,on_delete=models.CASCADE,verbose_name='班级')
    email = models.EmailField('邮箱',default=None)    # 默认为空   唯一值
    pwd = models.CharField('密码',max_length=20)

    # 修改显示的表的名字
    class Meta:
        verbose_name = '学生'
        verbose_name_plural = '学生信息表'

    def __str__(self):
        return self.name

# 教师表
class Teacher(models.Model):
    tid = models.AutoField('教师编号',primary_key=True)
    name = models.CharField('姓名',max_length=20,unique=True)
    sex = models.BooleanField('性别',choices=((0,'女'),(1,'男')))
    age = models.IntegerField('年龄')
    academy = models.ForeignKey(Academy,on_delete=models.CASCADE,verbose_name='学院')
    email = models.EmailField('邮箱',default=None)    # 默认为空   唯一值
    phone = models.CharField('联系方式',max_length=20,default=None)
    pwd = models.CharField('密码',max_length=20)

    # 修改显示的表的名字
    class Meta:
        verbose_name = '教师'
        verbose_name_plural = '教师信息表'

    def __str__(self):
        return self.name


# # 学生成绩表
class Record(models.Model):
    id = models.AutoField('序号',primary_key=True)
    sid = models.ForeignKey(Student,on_delete=models.CASCADE,verbose_name='学号')
    tid = models.ForeignKey(Teacher,on_delete=models.CASCADE,verbose_name='任课老师')
    course = models.ForeignKey(Course,on_delete=models.CASCADE,verbose_name='考试科目')
    grade = models.FloatField('成绩')
    rtime = models.DateField('考试时间',blank=True,null=True)
    year = models.CharField('学年',max_length=4)
    term = models.CharField('学期',max_length=4,choices=(('上','上'),('下','下')))

    class Meta:
        verbose_name = '学生成绩'
        verbose_name_plural = '学生成绩'

    def __str__(self):
        return self.term

3.定义视图函数

Django 中视图的概念是「一类具有相同功能和模板的网页的集合」。

比如,在一个学生信息系统中,我们可能需要如下几个视图:

  • 登录:输入用户和密码,根据校验结果进行登录处理。
  • 学院信息的增、删、改、查。
  • 学生成绩的增、删、改、查。

 这些需求都靠视图(View)来完成。

每一个视图表现为一个简单的Python函数,它需要要做的只有两件事:返回一个包含被请求页面内容的 HttpResponse对象,或者抛出一个异常,比如 Http404 。

视图函数中的request与网页发来的请求有关,里面包含get或post的内容、用户浏览器、系统等信息。

 比如我们先创建几个视图分别实现对学院的增删改查。

在文件:DjangoSms/app01/views.py 建立视图函数如下:

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

# Create your views here.
# 学院管理
def academy_list(request):
    academy = models.Academy.objects.all()
    return render(request, 'academy_list.html', {'academy_list': academy})

def edit_academy(request):
    if request.method == 'POST':
        edit_id = request.GET.get('id')
        edit_obj = models.Academy.objects.get(id=edit_id)
        new_name = request.POST.get('edit_name')
        edit_obj.name = new_name
        edit_obj.save()
        return redirect('/academy_list/')

    edit_id = request.GET.get('id')
    edit_obj = models.Academy.objects.get(id=edit_id)
    return render(request, 'academy_edit.html', {'academy': edit_obj})


def add_academy(request):
    if request.method == 'POST':
        new_academy_name = request.POST.get('name')
        models.Academy.objects.create(name=new_academy_name)
        return redirect('/academy_list/')
    return render(request, 'academy_add.html')


def drop_academy(request):
    drop_id = request.GET.get('id')
    drop_obj = models.Academy.objects.get(id=drop_id)
    drop_obj.delete()
    return redirect('/academy_list/')

 4.配置访问路由URL

有了视图后,我们需要将视图函数和Web网页链接对应起来。

url可以理解为访问网站时输入的网址链接,配置好url后Django才知道怎样定位app。

打开DjangoSms/urls.py,输入如下代码:

from django.contrib import admin
from django.urls import path , re_path

from app01 import views
urlpatterns = [
    re_path(r'^$', views.academy_list),
    re_path(r'^edit_academy', views.edit_academy),
    re_path(r'^academy_list', views.academy_list),
    re_path(r'^add_academy', views.add_academy),
    re_path(r'^drop_academy', views.drop_academy),
]

通过配置如上URL,Django 将会根据用户请求的 URL 来选择使用哪个视图。

 5.静态资源准备及配置

本系统前后端不分离,前端框架选用当前比较受欢迎的Bootstrap,为了满足毕设的个性化,显示同时兼顾开发效率,本文采用了一套做了部分定制基于Bootstrap的主题模板。

在项目根目录下新建一个文件夹static用于存放前端模板静态资源。

把我们准备好的文件复制到static文件夹

 准备好静态资源后,我们还需要在Django中指定静态文件的存放位置,这样才能够在模板中正确引用它们。

在DjangoSms/settings.py 中进行如下配置:

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),  # 添加此项
]

6.模板开发创建

 在创建模板之前,我们先在根目录下新建一个文件夹templates用于存放我们的所有的模板文件。

模板位置也同样需要进行配置指定模板的存放位置,在DjangoSms/settings.py 中进行如下配置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 添加此项
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

接着我们在模板文件中新建三个文件:

  • base.html:是整个项目的模板基础,所有的网页都从它继承;
  • header.html:是网页顶部的导航栏;
  • footer.html:是网页底部的注脚。

上述三个文件是网站页面的通用组件模块,基本上每个页面都不会变,所以我们把他们独立出来。

我们编写Django后续的页面模板时可以直接继承对应的通用模板组件。

分别编写三个静态HTML文件代码如下:

 templates/base.html:

<!--    载入静态文件-->
{% load static %}
<!-- 网站主语言 -->
<html lang="zh-cn">
<head>
  <meta charset="UTF-8">
  <title>{% block title %}{% endblock %}</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <!-- jQuery UI -->
  <link href="https://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" rel="stylesheet" media="screen">
  <!-- Bootstrap -->
  <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  <!-- styles -->
  <link href="/static/css/styles.css" rel="stylesheet">

  <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
  <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
  <![endif]-->
</head>

<body>
<!-- 引入导航栏 -->
{% include 'header.html' %}
<!-- 预留具体页面的位置 -->
{% block content %}{% endblock content %}
<!-- 引入注脚 -->
{% include 'footer.html' %}
<!-- bootstrap.js 依赖 jquery.js 和popper.js,因此在这里引入 -->
<!--<script src="{% static 'jquery/jquery-3.6.0.js' %}"></script>-->
<!--<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1-lts/dist/umd/popper.min.js"></script>-->
<!--
    popper.js 采用 cdn 远程引入,意思是你不需要把它下载到本地。
    在实际的开发中推荐静态文件尽量都使用 cdn 的形式。
    教程采用本地引入是为了让读者了解静态文件本地部署的流程。
-->

<link href="/static/vendors/datatables/dataTables.bootstrap.css" rel="stylesheet" media="screen">

<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://code.jquery.com/jquery.js"></script>
<!-- jQuery UI -->
<script src="https://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="/static/bootstrap/js/bootstrap.min.js"></script>

<script src="/static/vendors/datatables/js/jquery.dataTables.min.js"></script>

<script src="/static/vendors/datatables/dataTables.bootstrap.js"></script>

<script src="/static/js/custom.js"></script>
<script src="/static/js/tables.js"></script>

     <!-- bootstrap-datetimepicker -->
<link href="/static/vendors/bootstrap-datetimepicker/datetimepicker.css" rel="stylesheet">
<script src="/static/vendors/bootstrap-datetimepicker/bootstrap-datetimepicker.js"></script>


</body>

</html>

templates/header.html:

<div class="header">
  <div class="container">
    <div class="row">
      <div class="col-md-5">
        <!-- Logo -->
        <div class="logo">
          <h1><a href="/">学生信息管理系统</a></h1>
        </div>
      </div>
      <div class="col-md-5">
        <div class="row">
          <div class="col-lg-12">
            <div class="input-group form">
              <input type="text" class="form-control" placeholder="Search...">
              <span class="input-group-btn">
                <button class="btn btn-primary" type="button">搜索</button>
              </span>
            </div>
          </div>
        </div>
      </div>
      <div class="col-md-2">
        <div class="navbar navbar-inverse" role="banner">
          <nav class="collapse navbar-collapse bs-navbar-collapse navbar-right" role="navigation">
            <ul class="nav navbar-nav">
              <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">个人中心<b class="caret"></b></a>
                <ul class="dropdown-menu animated fadeInUp">
                  <li><a href="/login">Logout</a></li>
                </ul>
              </li>
            </ul>
          </nav>
        </div>
      </div>
    </div>
  </div>
</div>

templates/footer.html:

{% load static %}
<!-- Footer -->
<div>
  <br><br><br>
</div>
<footer class="py-3 bg-dark fixed-bottom">
  <div class="container">
    <p class="m-0 text-center text-white">Copyright &copy; DjangoSms 2022</p>
  </div>
</footer>

接下来我们就来实现详细各个视图函数对应的网页模板了

学院添加:academy_add.html

<!-- extends表明此页面继承自 base.html 文件 -->
{% extends "base.html" %} {% load static %}
<!-- 写入 base.html 中定义的 title -->
{% block title %} 学院列表 {% endblock title %}
<!-- 写入 base.html 中定义的 content -->
{% block content %}
<div class="page-content">
  <div class="row">
    <div class="col-md-2">
      <div class="sidebar content-box" style="display: block;">
        <ul class="nav">
          <!-- Main menu -->
          <li class="current"><a href="/academy_list"><i class="glyphicon glyphicon-home"></i>学院管理</a></li>
          <li ><a href="/major_list"><i class="glyphicon glyphicon-list"></i> 专业管理</a></li>
          <li><a href="/class_list"><i class="glyphicon glyphicon-tag"></i> 班级管理</a></li>
          <li><a href="/course_list"><i class="glyphicon glyphicon-file"></i>课程管理</a></li>
          <li><a href="/student_list"><i class="glyphicon glyphicon-user"></i>学生管理</a></li>
          <li><a href="/teacher_list"><i class="glyphicon glyphicon-pencil"></i>教师管理</a></li>
          <li><a href="/record_list"><i class="glyphicon glyphicon-th-list"></i>学生成绩管理</a></li>
          <li class="submenu">
            <a href="#">
              <i class="glyphicon glyphicon-cog"></i> 系统设置
              <span class="caret pull-right"></span>
            </a>
            <!-- Sub menu -->
            <ul>
              <li><a href="/login">Login</a></li>
              <li><a href="/signup">Signup</a></li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
    <div class="col-md-10">
      <div class="content-box-large">
        <div class="panel-heading">
          <div class="panel-title">新增学院</div>
        </div>
        <div class="panel-body">
          <form class="form-horizontal" role="form" action="/add_academy/" method="post">
            {% csrf_token %}
            <div class="form-group">
              <label for="input1" class="col-sm-2 control-label">学院名称</label>
              <div class="col-sm-10">
                <input class="form-control" id="input1" placeholder="学院名称" name="name">
              </div>
            </div>
            <div class="form-group">
              <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-primary">保存</button>
                <button type="submit" formmethod="get" formaction="/academy_list" class="btn btn-default">返回</button>
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
  </div>
</div>
{% endblock content %}

 学院编辑:academy_edit.html

<!-- extends表明此页面继承自 base.html 文件 -->
{% extends "base.html" %} {% load static %}
<!-- 写入 base.html 中定义的 title -->
{% block title %} 学院列表 {% endblock title %}
<!-- 写入 base.html 中定义的 content -->
{% block content %}
<div class="page-content">
  <div class="row">
    <div class="col-md-2">
      <div class="sidebar content-box" style="display: block;">
        <ul class="nav">
          <!-- Main menu -->
          <li class="current"><a href="/academy_list"><i class="glyphicon glyphicon-home"></i>学院管理</a></li>
          <li ><a href="/major_list"><i class="glyphicon glyphicon-list"></i> 专业管理</a></li>
          <li><a href="/class_list"><i class="glyphicon glyphicon-tag"></i> 班级管理</a></li>
          <li><a href="/course_list"><i class="glyphicon glyphicon-file"></i>课程管理</a></li>
          <li><a href="/student_list"><i class="glyphicon glyphicon-user"></i>学生管理</a></li>
          <li><a href="/teacher_list"><i class="glyphicon glyphicon-pencil"></i>教师管理</a></li>
          <li><a href="/record_list"><i class="glyphicon glyphicon-th-list"></i>学生成绩管理</a></li>
          <li class="submenu">
            <a href="#">
              <i class="glyphicon glyphicon-cog"></i> 系统设置
              <span class="caret pull-right"></span>
            </a>
            <!-- Sub menu -->
            <ul>
              <li><a href="/login">Login</a></li>
              <li><a href="/signup">Signup</a></li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
    <div class="col-md-10">
      <div class="content-box-large">
        <div class="panel-heading">
          <div class="panel-title">编辑学院</div>
        </div>
        <div class="panel-body">
          <form class="form-horizontal" role="form" action="/edit_academy/?id={{ academy.id }}" method="post">
            {% csrf_token %}
            {#<input type="text" name="edit_id" value="{{ academy.id }}" class="hide">#}
            <div class="form-group">
              <label for="input1" class="col-sm-2 control-label">学院名称</label>
              <div class="col-sm-10">
                <input class="form-control" id="input1" placeholder="姓名" name="edit_name" value="{{ academy.name }}">
              </div>
            </div>
            <div class="form-group">
              <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-primary">保存</button>
                <button type="submit" formmethod="get" formaction="/academy_list/" class="btn btn-default">返回</button>
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
  </div>
</div>
{% endblock content %}

学院列表:academy_list.html

<!-- extends表明此页面继承自 base.html 文件 -->
{% extends "base.html" %} {% load static %}
<!-- 写入 base.html 中定义的 title -->
{% block title %} 学院列表 {% endblock title %}
<!-- 写入 base.html 中定义的 content -->
{% block content %}
<div class="page-content">
  <div class="row">
    <div class="col-md-2">
      <div class="sidebar content-box" style="display: block;">
        <ul class="nav">
          <!-- Main menu -->
          <li class="current"><a href="/academy_list"><i class="glyphicon glyphicon-home"></i>学院管理</a></li>
          <li ><a href="/major_list"><i class="glyphicon glyphicon-list"></i> 专业管理</a></li>
          <li><a href="/class_list"><i class="glyphicon glyphicon-tag"></i> 班级管理</a></li>
          <li><a href="/course_list"><i class="glyphicon glyphicon-file"></i>课程管理</a></li>
          <li><a href="/student_list"><i class="glyphicon glyphicon-user"></i>学生管理</a></li>
          <li><a href="/teacher_list"><i class="glyphicon glyphicon-pencil"></i>教师管理</a></li>
          <li><a href="/record_list"><i class="glyphicon glyphicon-th-list"></i>学生成绩管理</a></li>
          <li class="submenu">
            <a href="#">
              <i class="glyphicon glyphicon-cog"></i> 系统设置
              <span class="caret pull-right"></span>
            </a>
            <!-- Sub menu -->
            <ul>
              <li><a href="/login">Login</a></li>
              <li><a href="/signup">Signup</a></li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
    <div class="col-md-10">
      <div class="content-box-large">
        <div class="panel-heading">
          <div class="panel-title">学院列表</div>
        </div>
        <div class="col-md-3 col-sm-6 pull-right add-btn">
          <a href="/add_academy/" class="btn btn-info pull-right">新增
          </a>
        </div>
        <div class="panel-body">
          <table cellpadding="0" cellspacing="0" border="0" class="table table-striped table-bordered" id="example">
            <thead>
            <tr>
              <th>序号</th>
              <th>学院名称</th>
              <th>操作</th>
            </tr>
            </thead>
            <tbody>
            {% for academy in academy_list %}
            <tr>
              <td>{{ forloop.counter }}</td>
              <td>{{ academy.name }}</td>
              <td class="text-center">
                <a class="btn btn-info btn-sm" href="/edit_academy/?id={{ academy.id }}"><i
                        class="fa fa-pencil fa-fw"
                        aria-hidden="true"></i>编辑
                </a>
                <a class="btn btn-danger btn-sm" href="/drop_academy/?id={{ academy.id }}"><i
                        class="fa fa-trash-o fa-fw"
                        aria-hidden="true"></i>删除
                </a>
              </td>
            </tr>
            {% endfor %}
            </tbody>
          </table>
        </div>
      </div>
    </div>
  </div>
</div>
{% endblock content %}

7.测试及运行

至此,我们已经在Django项目文件夹DjangoSms下创建了一个app:app01来管理我们的视图功能。

同时通过URL将视图和网页进行了数据的关联和展示。

在Windows命令行输入:

python manage.py runserver

运行服务器后在浏览器中输入我们之前配置的首页对应的URL地址:

http://127.0.0.1:8000/

首页展示如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux shell 多线程开发以及模板使用,详细一文透彻

Linux shell 多线程开发以及模板使用 序 在日常工作中&#xff0c;通常是起一个终端&#xff0c;通过 shell 连接我们的跳板机服务器&#xff0c;为此服务器提供一个进程供我们使用。但我们通常都是一条一条命令的运行&#xff0c;在某些需要并发的场景时就显得捉襟见肘。所以…

读取和写入音频文件

将数据写入到音频文件&#xff0c;获取文件信息&#xff0c;然后将数据读回到 MATLAB 工作区。 写入音频文件 获取有关音频文件的信息 读取音频文件 绘制音频数据图 写入音频文件 从文件 handel.mat 加载示例数据 load handel.mat 工作区现在包含音频数据矩阵 y 和采样率 …

Linux 中断子系统(六):核心数据结构

Linux中断子系统有六个核心数据结构,分别是: irq_desc irq_data irqactions irq_chip irq_domain irq_domain_ops关系如下: 强烈建议大家学习一个子系统之前,先研究这个子系统的核心数据结构,知道了他们的关系,你就知道这个子系统在做什么事情。 右侧的 irq_chip、irq…

(nio)Selector-处理消息边界-附件与扩容

⚠️ 不处理边界的问题 以前有同学写过这样的代码&#xff0c;思考注释中两个问题&#xff0c;以 bio 为例&#xff0c;其实 nio 道理是一样的 public class Server {public static void main(String[] args) throws IOException {ServerSocket ssnew ServerSocket(9000);whi…

算法训练营第四天| 24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节点 | 面试题 02.07. 链表相交 |142.环形链表II

24.两两交换链表中的节点 看完题后的思路 用两个指针pre,q指向1,2,创建一个虚拟头结点,使用尾插法插入**.难点在于初始条件的两个指针判空与终止条件的判断(奇数个节点与偶数个节点)** 初始节点判空无非三种情况,空节点,一个节点,直接使用一个判断解决 当个数是奇数时,pre指向…

Alluxio 2022技术干货年终大赏

2022&#xff0c;我们积累了很多应用案例&#xff0c;邀请了很多嘉宾参与了我们的社区直播活动 17场主题活动&#xff08;Alluxio Day、Meetup、Datafun Summit等&#xff09; 44位嘉宾44个主题&#xff08;来自一线大厂的实战者&#xff09; 2000分钟的分享时长&#xff08;内…

【项目实战】使用Maven打包生成jar包到指定目录

一、背景&#xff08;Maven打包存在的问题&#xff09; Maven默认打包后&#xff0c;jar文件都是生成在各自服务的target下&#xff0c;对微服务的部署不太友好&#xff0c;需要整个项目上传服务器&#xff0c;里面包含了源码 二、如何解决以上问题&#xff1f; 其实可以在打…

[激光原理与应用-63]:激光器-光学-探测光、泵浦光和种子光三种光的区别

目录 种子光 泵浦光&#xff1a; 探测光&#xff1a; 种子光 种子光是用来放大出光的&#xff0c;它的作用好比在激光中增加了受激辐射的光子数&#xff0c;因此加快放大出光。 为放大器或者其它激光器产生种子光的激光器。 种子激光器是其输出光被注入到一些放大器或者其…

类(class)-结构体(struct)-共用体(union)的异同

一、"类" 的介绍在C中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点…

10道题熟练掌握并运用链表结构算法

目录 1.牛客BM3 链表中的节点每k个一组翻转 2.BM4 合并两个排序的链表 3.BM5 合并k个已排序的链表 4.BM6 判断链表中是否有环 5.BM7 链表中环的入口结点 6.BM8 链表中倒数最后k个结点 7.BM9 删除链表的倒数第n个节点 8.BM10 两个链表的第一个公共结点 9.BM11 链表相加(…

将写好的.py/.java程序变成.exe文件

目录 一、背景 1.1、前言 1.2、说明 二、优点与缺点分析 2.1、优点 2.2、缺点 三、将.py变成.exe步骤 3.1、下载需要的库 3.2、pycharm控制台.py->.exe文件 3.3、命令行.py->.exe文件 四、.py->.exe->执行.exe可能会遇到的报错与解决办法 4.1、pyinsta…

第2章 ESP32 日志

ESP32 日志 UART配置 新建工程 查看->命令面板&#xff0c;输入esp-idf:new project&#xff0c;一路完成工程创建选择menuconfig&#xff0c;输入UART 输入UART 自定义波特率改为&#xff1a;460800 日志打印 ESP32的日志打印函数 ESP_LOGx分成5个等级&#xff1a;err…

前端笔记总结+注册登录页案例

day 1 前端开发 目的&#xff1a;开发一个平台&#xff08;网站&#xff09; 前端开发&#xff1a;HTML、CSS、JavaScript Web框架&#xff1a;接收请求并处理 - Flask、Djiango MySQL数据库&#xff1a;存储数据的地方快速上手&#xff1a;基于Flask Web框架快速搭建一个网站…

Spring Cloud Alibaba商城实战项目(day02)

四、搭建Spring Cloud Alibaba环境 4.1、简介 官方文档&#xff1a;https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html 我们所选用的组件&#xff1a; SpringCloud Alibaba - Nacos&#xff1a;注册中心&#xff08;服务发现/注册&#xf…

还不会二分查找?看这一篇就够了

目录一、整数二分1.1 二分查找模板1.1.1 寻找右边界的二分查找1.1.2 寻找左边界的二分查找1.2 应用&#xff1a;寻找元素的起始位置和终止位置二、浮点数二分2.1 浮点数二分模板2.2 应用&#xff1a;数的三次方根三、使用STL进行二分查找3.1 std::binary_search3.2 std::lower_…

27-Golang中的错误处理机制

Golang中的错误处理机制说明基本说明使用deferrecover处理上述代码错误处理机制的好处自定义错误说明 package main import ("fmt" )func test() {num1 : 10num2 : 0res : num1 / num2fmt.Println("res", res) }func fmt() {test ()fmt.Println("mai…

分享77个Java源码,总有一款适合您

Java源码 分享77个Java源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1EhB4snvWia5eCztyfiX_2A?pwdbofo …

wish、亚马逊、ebay、沃尔玛自养号测评补单优势之分析技巧

测评补单的资源可以说是卖家非常宝贵的财富&#xff0c;通过测评补单和广告相结合&#xff0c;可以快速有效的提升店铺的产品销量&#xff0c;提高转化&#xff0c;提升listing权重&#xff0c;如果是做自养号还可以不用担心以后被别人牵制&#xff0c;毕竟资源掌握在自己手上&…

docker-基础实战第二课

Docker三剑客 Docker 镜像&#xff08;Image&#xff09;&#xff1a;镜像可以用来创建容器&#xff0c;一个镜像可以创建多个容器。 容器&#xff1a;容器实例就是指实际运行的实例&#xff0c;可以理解为镜像是java的类&#xff0c;容器就是new出来的对象。 仓库&#xff1a;…

elasticsearch实现基于拼音搜索

1、背景 一般情况下&#xff0c;有些搜索需求是需要根据拼音和中文来搜索的&#xff0c;那么在elasticsearch中是如何来实现基于拼音来搜索的呢&#xff1f;可以通过elasticsearch-analysis-pinyin分析器来实现。 2、安装拼音分词器 # 进入 es 的插件目录 cd /usr/local/es/…