Django练习-学生管理系统案例

项目准备

创建项目

django-admin startproject Mydjango
cd Mydjango
python manage.py startapp APP

项目架构

Mydjango
    APP
        migrations
            0001_initial.py
        static
            style.css
        templates
            index.html          [首页入口页面]
            add_classes.html    [添加班级页面]
            add_students.html   [添加学生页面]
            add_teachers.html   [添加老师页面]
            edit_classes.html   [编辑班级页面]
            edit_students.html  [编辑学生页面]
            edit_teachers.html  [编辑老师页面]
            get_classes.html    [班级展示页面]
            get_students.html   [学生展示页面]
            get_teachers.html   [老师展示页面]
            set_teacher.html    [班级分配老师页面]
        views
            index.py            [首页视图]
            classes.py          [班级视图]
            students.py         [学生视图]
            teachers.py         [老师视图]
        admin.py
        apps.py
        models.py
        tests.py
    Mydjango
        settings.py
        urls.py
        wsgi.py
    db.sqlite3
    manage.py

static

style.css

*{margin: auto;}
a,table {text-decoration:none; padding: 10px}
thead {font-size: 18px;}
table {border-spacing:0;border-collapse:collapse;background:lightskyblue; text-align: center;margin-top: 20px;}
table > th,td{padding: 5px 20px;}

.list_top{width: 200px; font-size: 30px;font-weight:bold;margin-top: 30px;}

templates

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>学生管理系统</title>
        <style>
            *{margin: auto;text-align: center;}
            h1{margin-top: 10%;margin-bottom: 30px;}
            div{margin-top: 50px;}
            div>a {text-decoration:none;margin: 10px;padding: 15px;background: lightskyblue;border-radius:10px; -moz-border-radius:10px;}
        </style>
    </head>
    <body>
    <h1>PythonDjango框架练习-学生管理系统</h1>
    <div>
        <a href="classes.html">班级展示页面</a>
        <a href="teachers.html">老师展示页面</a>
        <a href="students.html">学生展示页面</a>
    </div>
    </body>
</html>

add_classes.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <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>

add_students.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加学生</title>
</head>
<body>
    <form action="/add_students.html" method="POST">
        {% csrf_token %}
        <p><input type="text" name="username" placeholder="姓名" value=""/></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">
                <!--循环显示班级列表id和名称-->
                {% for row in cs_list %}
                    <option value="{{ row.id }}">{{ row.titile }}</option>
                {% endfor %}
            </select>
        </p>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

add_teachers.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加老师</title>
</head>
<body>
    <form action="/add_teachers.html" method="POST">
        {% csrf_token %}
        <p><input type="text" name="name" 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>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

edit_classes.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑班级</title>
</head>
<body>
    <!--将id和修改数值一并提交-->
    <form method="POST" action="/edit_classes.html">
        {% csrf_token %}
        <!-- value值为后台查询到的对象[需要编辑的id和值] -->
        <input type="text" name="id" value="{{ obj.id }}" style="display: none"/>
        <input type="text" name="con" value="{{ obj.titile }}"/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

edit_students.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑学生</title>
</head>
<body>
    <form action="/edit_students.html" method="POST">
        {% csrf_token %}
        <p style="display: none">
            <!--隐藏id项-->
            <input typpe="text" name="nid" value="{{ obj.id }}">
        </p>
        <p><input type="text" name="username" placeholder="姓名" value="{{ obj.username }}"/></p>
        <p><input type="text" name="age" placeholder="年龄" value="{{ obj.age }}"/></p>
        <p>
            {% if obj.gender %}
            <!--判断性别单选项-->
                男:<input type="radio" name="gender" value="1" checked="checked"/>
                女:<input type="radio" name="gender" value="0" />
            {% else %}
                男:<input type="radio" name="gender" value="1"  />
                女:<input type="radio" name="gender" value="0" checked="checked"/>
            {% endif %}
        </p>
        <p>
            <select name="cs_list">
                <!--循环班级列表-->
                {% for row in cs_list %}
                    <!--循环判断原有的id和名称-->
                    {% if row.id == obj.cs_id %}
                        <option value="{{ row.id }}" selected="selected">{{ row.titile }}</option>
                    {% else %}
                        <option value="{{ row.id }}" >{{ row.titile }}</option>
                    {% endif %}
                {% endfor %}
            </select>
        </p>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

edit_teachers.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑老师</title>
</head>
<body>
    <form action="/edit_teachers.html" method="POST">
        {% csrf_token %}
        <p style="display: none">
            <!--隐藏id项-->
            <input typpe="text" name="nid" value="{{ obj.id }}">
        </p>
        <p><input type="text" name="name" placeholder="姓名" value="{{ obj.name }}"/></p>
        <p><input type="text" name="age" placeholder="年龄" value="{{ obj.age }}"/></p>
        <p>
            {% if obj.gender %}
            <!--判断性别单选项-->
                男:<input type="radio" name="gender" value="1" checked="checked"/>
                女:<input type="radio" name="gender" value="0" />
            {% else %}
                男:<input type="radio" name="gender" value="1"  />
                女:<input type="radio" name="gender" value="0" checked="checked"/>
            {% endif %}
        </p>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

get_classes.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级页面</title>
    <link href="static/style.css" rel="stylesheet">
</head>
<body>
    <div class="list_top">
        <a href="add_classes.html">添加班级</a>
    </div>
    <table border="1">
       <thead>
            <th>序列号</th>
            <th>名称</th>
            <th>任课老师</th>
            <th>操作</th>
       </thead>
        <tbody>
            {% for row in cls_list %}
            <!--循环班级列表-->
            <tr>
                <td>
                    {{ row.id }}
                    <!--获取班级列表id字段-->
                </td>
                <td>
                    {{ row.titile }}
                    <!--获取班级列表title字段-->
                </td>
                <td>
                    <!--{{ row.m.all }}为当前班级所有任课老师的对象,循环并取老师名字展示【和分配页面取法略有差异】-->
                    {% for item in row.m.all %}
                        <span>{{ item.name }}</span>
                    {% endfor %}
                </td>
                <th>
                    <!--传参数nid={{row.id}}到后端,避免使用全局id-->
                    <a href="/edit_classes.html?nid={{ row.id }}">编辑</a>|
                    <a href="/del_classes.html?nid={{ row.id }}">删除</a>|
                    <a href="/set_teacher.html?nid={{ row.id }}">分配老师</a>
                </th>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

get_students.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生页面</title>
    <link href="static/style.css" rel="stylesheet">
</head>
<body>
    <div class="list_top">
        <a href="add_students.html">添加学生</a>
    </div>
    <table border="1">
       <thead>
            <th>序列号</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>性别</th>
            <th>班级</th>
            <th>操作</th>
       </thead>
        <tbody>
            {% for row in stu_list %}
            <!--循环学生列表-->
            <tr>
                <td>
                    {{ row.id }}
                    <!--获取学生列表id字段-->
                </td>
                <td>
                    {{ row.username }}
                    <!--获取学生列表姓名字段-->
                </td>
                <td>
                    {{ row.age }}
                    <!--获取学生列表年龄字段-->
                </td>
                <td>
                    <!--根据布尔值判断性别-->
                    {% if row.gender == True %}
                        男
                    {% else %}
                        女
                    {% endif %}
                    <!--获取学生列表性别字段-->
                </td>
                <td>
                    {{ row.cs.titile }}
                    <!--获取学生列表班级字段-->
                </td>
                <th>
                    <!--传参数nid={{row.id}}到后端,避免使用全局id-->
                    <a href="/edit_students.html?nid={{ row.id }}">编辑</a>|
                    <a href="/del_students.html?nid={{ row.id }}">删除</a>

                </th>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

get_teachers.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>老师页面</title>
    <link href="static/style.css" rel="stylesheet">
</head>
<body>
    <div class="list_top">
        <a href="add_teachers.html">添加老师</a>
    </div>
    <table border="1">
       <thead>
            <th>序列号</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>性别</th>
            <th>操作</th>
       </thead>
        <tbody>
            {% for row in tea_list %}
            <!--循环老师列表-->
            <tr>
                <td>
                    {{ row.id }}
                    <!--获取老师列表id字段-->
                </td>
                <td>
                    {{ row.name }}
                    <!--获取老师列表姓名字段-->
                </td>
                <td>
                    {{ row.age }}
                    <!--获取老师列表年龄字段-->
                </td>
                <td>
                    <!--根据布尔值判断性别-->
                    {% if row.gender == True %}
                        男
                    {% else %}
                        女
                    {% endif %}
                    <!--获取老师列表性别字段-->
                </td>
                <th>
                    <!--传参数nid={{row.id}}到后端,避免使用全局id-->
                    <a href="/edit_teachers.html?nid={{ row.id }}">编辑</a>|
                    <a href="/del_teachers.html?nid={{ row.id }}">删除</a>
                </th>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

set_teacher.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>分配老师</title>
</head>
<body>

    <form method="POST" action="/set_teacher.html?nid={{ nid }}">
        {% csrf_token %}

        <p>当前班级老师:
            {% for itum in cs_tea_list %}
                {{ itum }}
            {% endfor %}
        </p>
        <p>
            <strong>需要修改请在以下栏目中选择并提交【支持多选】</strong>
        </p>
        <select multiple name="teacher_ids">
            {% for item in all_teacher_list %}
                {% if item in all_reacher_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>

views

classes.py

# -*- coding:utf8 -*-
from django.shortcuts import render,redirect
from APP 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":                                         #判断提交方式是否为GET
        return render(request, 'add_classes.html')                      #返回添加页面
    elif request.method == "POST":                                      #判断提交方式是否为POST
        title = request.POST.get('title')                               #获取班级名称
        models.Classes.objects.create(titile=title)                     #创建新的班级
        return redirect('/classes.html')                                #返回班级列表

def del_classes(request):                                               #删除班级
    nid = request.GET.get('nid')                                        #获取要删除的班级id
    models.Classes.objects.filter(id=nid).delete()                      #删除班级
    return redirect('/classes.html')                                    #返回班级列表
def edit_classes(request):                                              #编辑班级
    if request.method == "GET":                                         #判断提交方式是否为GET
        nid = request.GET.get('nid')                                    #获取编辑列的id
        obj = models.Classes.objects.filter(id=nid).first()             #获取编辑列的值
        return render(request,'edit_classes.html',{'obj':obj})          #返回编辑页面,并附加要修改的值
    elif request.method == "POST":                                      #判断提交方式是否为POST
        nid = request.POST.get("id")                                    #获取编辑列的id
        title = request.POST.get("con")                                 #获取编辑列的名称
        models.Classes.objects.filter(id=nid).update(titile=title)      #更新数据
        return redirect('/classes.html')                                #返回班级页面
def set_teacher(request):
    if request.method == 'GET':
        nid = request.GET.get('nid')                                        #获取当前要分配老师的班级id
        all_teacher_list = models.Teachers.objects.all()                    #获取所有老师
        cls_obj = models.Classes.objects.filter(id=nid).first()             #获取班级id对应的对象
        print("班级ID对象",cls_obj)
        cs_tea_list=cls_obj.m.all()                                         #获取当前班级的老师
        print("当前班级老师,不带ID用于展示",cs_tea_list)
        cls_teacher_list = cls_obj.m.all().values_list('id','name')         #获取当前班级老师的id和姓名,班级对象多对多关系正向查询
        print("当前班级老师带ID,用于查询和选择", cls_teacher_list)

        id_list = list(zip(*cls_teacher_list))[0] if list(zip(*cls_teacher_list)) else []        #zip格式化函数进行压缩格式化便于取值
        print("当前班级老师ID",id_list)
        return render(request,'set_teacher.html',                           #返回当前班级的老师和所有老师
                      {
                          'cls_teacher_list':id_list,
                          'all_teacher_list':all_teacher_list,
                          'nid':nid,
                          "cs_tea_list":cs_tea_list
                      })
    elif request.method == "POST":
        nid = request.GET.get('nid')                                        #当前编辑修改的ID
        print("当前编辑修改的ID",nid)
        ids = request.POST.getlist('teacher_ids')                           #分配的老师ID
        print("当前分配的老师ID",ids)
        obj = models.Classes.objects.filter(id=nid).first()                 #获取班级id对应的对象

        obj.m.set(ids)                                                      #修改分配老师
        return redirect('/classes.html')

index.py

# -*- coding:utf8 -*-
from django.shortcuts import render,redirect
from APP import models

def portal(request):
    return render(request, 'index.html')

students.py

# -*- coding:utf8 -*-
from django.shortcuts import render,redirect
from APP 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')                                                                #获取要删除的学生id
    models.Students.objects.filter(id=nid).delete()                                             #删除选中学生
    return redirect('/students.html')                                                           #删除后刷新跳转到学生信息页面
def edit_students(request):                                                     #学生信息修改
    if request.method == "GET":                                                                 #判断提交方式是否为GET
        nid = request.GET.get('nid')                                                            #获取编辑列的id
        obj = models.Students.objects.filter(id=nid).first()                                    #获取编辑列的值
        cs_list = models.Classes.objects.values('id','titile')                                  #获取班级列表id和名称,用于修改学生班级下拉菜单
        return render(request,'edit_students.html',{'obj':obj,'cs_list':cs_list})               #返回编辑页面,并附加要修改的值
    elif request.method == "POST":                                                              #判断提交方式是否为POST
        nid = request.POST.get("nid")                                                           #获取编辑列的id
        u = request.POST.get("username")                                                        #获取编辑列的姓名
        a = request.POST.get("age")                                                             #获取编辑列的年龄
        g = request.POST.get("gender")                                                          #获取编辑列的性别
        class_id = request.POST.get("cs_list")                                                  #获取编辑列的班级
        models.Students.objects.filter(id=nid).update(username=u,age=a,gender=g,cs_id=class_id) #更新数据
        return redirect('/students.html')                                                       #返回班级页面

teachers.py

# -*- coding:utf8 -*-
from django.shortcuts import render,redirect
from APP import models

def get_teachers(request):                                    # 老师信息展示
    tea_list = models.Teachers.objects.all()                                # 获取所有老师列表
    return render(request, 'get_teachers.html', {'tea_list': tea_list})     # 返回老师页面,附加所有老师列表参数
def add_teachers(request):                                    # 老师信息添加
    if request.method == 'GET':                                             # 判断提交方式
        return render(request, 'add_teachers.html')                         # 返回添加老师页面
    elif request.method == 'POST':                                          # 判断提交方式
        u = request.POST.get('name')                                        # 获取填写姓名
        a = request.POST.get('age')                                         # 获取填写年龄
        g = request.POST.get('gender')                                      # 获取选择性别
        # 获取的字段内容添加到数据库
        models.Teachers.objects.create(
            name=u,
            age=a,
            gender=g,
        )
        return redirect('/teachers.html')                                   # 跳转到老师信息页面
def del_teachers(request):                                  # 老师信息删除
    nid = request.GET.get('nid')                                            # 获取要删除的老师id
    models.Teachers.objects.filter(id=nid).delete()                         # 删除选中老师
    return redirect('/teachers.html')                                       # 删除后刷新跳转到老师信息页面
def edit_teachers(request):                                 # 老师信息修改
    if request.method == "GET":                                                                 #判断提交方式是否为GET
        nid = request.GET.get('nid')                                                            #获取编辑列的id
        obj = models.Teachers.objects.filter(id=nid).first()                                    #获取编辑列的值
        cs_list = models.Classes.objects.values('id','titile')                                  #获取班级列表id和名称,用于修改学生班级下拉菜单
        return render(request,'edit_teachers.html',{'obj':obj,'cs_list':cs_list})               #返回编辑页面,并附加要修改的值
    elif request.method == "POST":                                                              #判断提交方式是否为POST
        nid = request.POST.get("nid")                                                           #获取编辑列的id
        u = request.POST.get("name")                                                            #获取编辑列的姓名
        a = request.POST.get("age")                                                             #获取编辑列的年龄
        g = request.POST.get("gender")                                                          #获取编辑列的性别
        models.Teachers.objects.filter(id=nid).update(name=u,age=a,gender=g)                    #更新数据
        return redirect('/teachers.html')                                                       #返回班级页面

admin.py

系统默认未变动

apps.py

from django.apps import AppConfig


class AppConfig(AppConfig):
    name = 'APP'

models.py

# -*- coding:utf8 -*-
from django.db import models

class Classes(models.Model):
    """
    班级表
    """
    titile = models.CharField(max_length=32)                    #班级名称
    m = models.ManyToManyField("Teachers")                      #班级和老师【多对多关系表】
class Teachers(models.Model):
    """
    教师表
    """
    name = models.CharField(max_length=32)                      #姓名
    age = models.IntegerField()                                 #年龄
    gender = models.BooleanField()                              #性别
class Students(models.Model):
    """
    学生表
    """
    username = models.CharField(max_length=32)                  #姓名
    age = models.IntegerField()                                 #年龄
    gender = models.BooleanField()                              #性别
    cs = models.ForeignKey("Classes",on_delete=models.CASCADE,) #学生和班级【一对多关系表】

Mydjango

settings.py

INSTALLED_APPS

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'APP',
]

TEMPLATES

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'APP/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',
            ],
        },
    },
]

DATABASES

实验环境使用sqlite3数据库,可根据自身需求变更为其它数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

LANGUAGE_CODE

LANGUAGE_CODE = 'zh-hans'

STATIC_URL

STATIC_URL = '/static/'

STATICFILES_DIRS

STATICFILES_DIRS=(
    os.path.join(BASE_DIR,"APP/static"),
    )

urls.py

# -*- coding:utf8 -*-
from django.contrib import admin
from django.urls import path,re_path
from APP.views import index,classes,students,teachers

urlpatterns = [
    path('admin/', admin.site.urls),                        # admin管理后台
    re_path('^$',index.portal),                             # 首页

    re_path('^classes.html$', classes.get_classes),         # 班级页面
    re_path('^add_classes.html$', classes.add_classes),     # 添加班级
    re_path('^del_classes.html$', classes.del_classes),     # 删除班级
    re_path('^edit_classes.html$', classes.edit_classes),   # 编辑班级
    re_path('^set_teacher.html$', classes.set_teacher),     # 分配老师

    re_path('^students.html$', students.get_students),      # 学生页面
    re_path('^add_students.html$', students.add_students),  # 添加学生
    re_path('^del_students.html$', students.del_students),  # 删除学生
    re_path('^edit_students.html$', students.edit_students),# 编辑学生

    re_path('^teachers.html$', teachers.get_teachers),      # 老师页面
    re_path('^add_teachers.html$', teachers.add_teachers),  # 添加老师
    re_path('^del_teachers.html$', teachers.del_teachers),  # 删除老师
    re_path('^edit_teachers.html$', teachers.edit_teachers),# 编辑老师

]

测试

生成数据表

python manage.py makemigrations APP
python manage.py migrate

运行服务访问测试

python manage.py runserver

转载于:https://my.oschina.net/zhaojunhui/blog/2906885

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值