Django:学生管理系统


一 前期准备:

1.创建Django项目

2.创建app

python manage.py startapp app01

3.修改配置文件 

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

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

4.数据库设计:

from django.db import models

# Create your models here.

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


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


class Student(models.Model):
    '''
    学生表
    '''
    username = models.CharField(max_length=32)
    age = models.IntegerField()
    gender = models.BooleanField()
    cs = models.ForeignKey(Classes)
models.py

 

 

 

二 管理模块的实现:

  1.班级管理(单表操作)  

路由分发:

"""lin_day54 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

from app01.views import classes

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),
]
url.py

 

模板Template:

主页面:

查:从数据库获取所有记录(QuerySet),locals()传递到前端,然后前端for循环显示所有记录

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <a href="/add_classes.html">添加</a>
    </div>
    <div>
        <table border="1">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>名称</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                {% for i in cls_list %}
                    <tr>
                        <td>{{ i.id }}</td>
                        <td>{{ i.title }}</td>
                        <td>
                            <a href="/del_classes.html?n_id={{ i.id }}">删除</a>|
                            <a href="/edit_classes.html?n_id={{ i.id }}">编辑</a>

                        </td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
</body>
</html>
get_classes.html

 

增:点击添加,get方式请求返回一个add页面,输入要添加的班级,form表单post方式提交,后台添加班级

<!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" placeholder="请输入你要添加的班级">
        <input type="submit">
    </form>
</body>
</html>
add_classes.html

 

改:点击编辑,get方式请求,返回一个edit页面,页面表单type='text'中显示原先的值,form表单post方式提交新的值到后台,后台update更新

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/edit_classes.html/?n_id={{ obj.id }}" method="post">
        {% csrf_token %}
{#        <input type="text" name="id" value="{{ obj.id }}" style="display: none">#}
        <input type="text" name="title" value="{{ obj.title }}">
        <input type="submit">
    </form>
</body>
</html>
edit_classes.html

 

删:删除记录只需要传递要删除的id,可以不用有页面

 

视图函数:

 查:显示所有记录:

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):
    n_id = request.GET.get('n_id')
    print(n_id)
    models.Classes.objects.filter(id=n_id).delete()
    return redirect('/classes.html')

改:

def edit_classes(request):
    if request.method == "GET" :
        n_id = request.GET.get('n_id')
        obj = models.Classes.objects.filter(id=n_id).first()
        return render(request,'edit_classes.html',{"obj":obj})

    elif request.method == 'POST':
        n_id = request.GET.get('n_id')
        title=request.POST.get('title')
        models.Classes.objects.filter(id=n_id).update(title=title)

        return redirect("/classes.html")

 

  2.学员管理(一对多表操作) 

路由分发:

    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),
urls.py

 

模板Template:

主页面:

 查:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <a href="/add_students.html">添加</a>
</div>
<div>
    <table border="1">
        <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/?n_id={{ row.id }}">删除</a>
                        |
                        <a href="/edit_students.html/?n_id={{ row.id }}">编辑</a>
                    </td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
</div>

</body>
</html>
get_students.html

 

增:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>添加用户</h3>
<form action="/add_students.html/" method="post">
{% 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="2">
    </p>
    <p>
        <select name="cs">
            {% for row in cs_list %}
                <option value="{{ row.id }}">{{ row.title }}</option>
            {% endfor %}
        </select>
    </p>
    <input type="submit" value="提交">
</form>
</body>
</html>
add_students.html

 

改:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>编辑用户</h3>

<form action="/edit_students.html/?n_id={{ stu_obj.id }}" method="post">
    {% csrf_token %}
{#    <p>ID :<input type="text" name="username" value="{{ stu_obj.id }}"></p>#}
    <p>姓名: <input type="text" name="username" value="{{ stu_obj.username }}"></p>
    <p>年龄: <input type="text" name="age" value="{{ stu_obj.age}}"></p>

    <p>性别:
        {% if stu_obj.gender %}
           男:<input type="radio" name="gender" value='1' checked >
           女:<input type="radio" name="gender" value='0'>
            {% else %}
            男:<input type="radio" name="gender" value='1'>
            女:<input type="radio" name="gender" value='0' checked >
        {% endif %}
    </p>
    <p>
        <select name="class_id">
            {% for cls in cls_list %}
                {% if stu_obj.cs_id == cls.id %}
                    <option value="{{ cls.id }}" selected>{{ cls.title }}</option>
                {% else %}
                    <option value="{{ cls.id }}">{{ cls.title }}</option>
                {% endif %}
            {% endfor %}
        </select>
    </p>

    <p><input type="submit" value="提交"></p>

</form>

</body>
</html>
edit_students.html

 

删:删除记录只需要传递要删除的id,可以不用有页面

 

视图函数

查:

def get_students(request):
    stu_list = models.Student.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":
        username = request.POST.get("username")
        age = request.POST.get("age")
        gender = request.POST.get("gender")
        cs = request.POST.get("cs")

        models.Student.objects.create(
            username = username,
            age = age,
            gender = gender,
            cs_id = cs,
        )
        return redirect('/students.html/')

删:

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

改:

def edit_students(request):
    if request.method == "GET":
        n_id = request.GET.get('n_id')
        stu_obj = models.Student.objects.filter(id=n_id).first()
        #stu_obj中有当前学生的信息    包括班级ID cs_id=1

        cls_list = models.Classes.objects.values('id','title')
        #cls_list中有所有班级的信息
        #ID             班级名称
        #1                  1班      selected
        #2                  2班

        return render(request,'edit_students.html',{'stu_obj':stu_obj,'cls_list':cls_list})

    elif request.method == "POST":
        n_id = request.GET.get('n_id')
        user = request.POST.get('username')
        age = request.POST.get('age')
        gender = request.POST.get('gender')
        class_id = request.POST.get('class_id')
        models.Student.objects.filter(id=n_id).update(username=user,age=age,gender=gender,cs_id=class_id)
        return redirect('/students.html')

 

  3 给班级分配教师(多对多操作)

在班级管理(单表操作)的基础上加多一个功能---->任课教师分配

路由分发:

    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('set_teacher.html/', classes.set_teacher),
urls.py

 

模板Template:

主页面:

查:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <a href="/add_classes.html">添加</a>
</div>
<div>
    <table border="1">
        <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> {#在前端使用all等方法不需要加括号#}
                        {% for item in row.m.all %}
                            <span>{{ item.name }}</span>
                        {% endfor %}

                    </td>
                    <td>
                        <a href="/del_classes.html/?n_id={{ row.id }}">删除</a>
                        |
                        <a href="/edit_classes.html/?n_id={{ row.id }}">编辑</a>
                        |
                        <a href="/set_teacher.html/?n_id={{ row.id }}">分配老师</a>
                    </td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
</div>

</body>
</html>
get_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" placeholder="请输入班级名称">
        <input type="submit" value="提交">
    </form>
</body>
</html>
add_classes.html

改:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/edit_classes.html/?n_id={{ obj.id }}" method="POST">
        {% csrf_token %}
{#        <input type="text" name="id" value="{{ obj.id }}" style="display: none"></input>#}
        <input type="text" name="title" value="{{ obj.title }}">
        <input type="submit" value="提交">
    </form>

</body>
</html>
add_classes.html

 

删:删除记录只需要传递要删除的id,可以不用有页面

 

分配教师:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/set_teacher.html/?n_id={{ n_id }}" method="post">
    {% csrf_token %}
    <select name="teacher_ids" multiple size="10" >
        {% for all_teacher in all_teacher_list %}

            {% if all_teacher.id in id_list %}
                <option value="{{ all_teacher.id }}" selected>{{ all_teacher.name }}</option>
            {% else %}
                <option value="{{ all_teacher.id }}">{{ all_teacher.name }}</option>
            {% endif %}

        {% endfor %}
    </select>
    <input type="submit" value="提交">
</form>
</body>
</html>
set_teacher.html

 

视图函数:

查:

def get_classes(request):
    cls_list = models.Classes.objects.all()
    # print(cls_list)
    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):
    n_id = request.GET.get('n_id')
    models.Classes.objects.filter(id=n_id).delete()
    return redirect('/classes.html/')

改:

def edit_classes(request):
    if request.method == "GET":
        n_id = request.GET.get('n_id')
        obj = models.Classes.objects.filter(id=n_id).first()
        return render(request,'edit_classes.html',{'obj':obj})

    elif request.method == 'POST':
        n_id = request.GET.get('n_id')
        title = request.POST.get('title')
        models.Classes.objects.filter(id=n_id).update(title=title)
        return redirect('/classes.html/')

教师分配:

def set_teacher(request):
    if request.method == 'GET':
        #获取当前要操作的记录的id
        n_id = request.GET.get('n_id')

        #获取id=n_id的班级对象
        cls_obj = models.Classes.objects.filter(id=n_id).first()

        #获取该班级的所有教师的id与名称
        cls_teacher_list = cls_obj.m.all().values_list('id','name')

        #获取该班级的所有教师的id,组成一个列表
        id_list = list(zip(*cls_teacher_list))[0] if list(zip(*cls_teacher_list)) else []

        #获取该学校的所有的教师
        all_teacher_list = models.Teachers.objects.all()

        return render(request,
                      'set_teacher.html',
                      {
                          'id_list':id_list,
                          'all_teacher_list':all_teacher_list,
                          'n_id':n_id
                       }
                      )
    elif request.method == 'POST':
        n_id = request.GET.get('n_id')
        ids = request.POST.getlist('teacher_ids')
        print('当前班级的id',n_id)
        print('分配的教师id',ids)
        obj = models.Classes.objects.filter(id=n_id).first()
        obj.m.set(ids)
        return redirect('/classes.html')

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM