基于Web( Django)的学生信息管理系统(课设版)

基于Web( Django)的学生信息管理系统(课设版)

以实战方式-零基础-Django入门



前言

针对常州大学Python课程设计《基于Web( Django)的学生信息管理系统》这一选题,本章内容将介绍如何快速地基于Django框架搭建系统,以实战方式零基础入门django的简单项目。其他高校在校大学生也可参考开发自己的项目。
关于django的详细概念和更多功能和内容请查阅其他资料,本次课程设计的追求是简约、快速、高效。
课设版:不讲述项目完成后的服务器部署和上线,无需配置媒体文件,settings.py中DEBUG = True下运行项目,即本地测试网站。
项目源代码见文章尾部,关于网页的css、js、img文件见源代码,文章中不展示。
文章篇幅较大,不阐述代码细节,视图实现基于FBV。

课设内容要求

1.登录与注册
2.个人基本信息管理模块
3.日程安排模块: 添加某时间段要做的若干事情(标题,内容,开始\结束时间)
4.完成课程设计报告


项目流程图

在这里插入图片描述

一、走进Django

Django是一个开放源代码的Web应用框架,由Python写成。
Django采用了MTV的框架模式,即模型(Model)、模板(Template)和视图(View),三者之间各自负责不同的职责。
Django的主要目的是简便、快速地开发数据库驱动的网站。它强调代码复用,多个组件可以很方便地以插件的形式服务于整个框架。

二、创建项目

1.准备工作

PyCharm
Python3.5或以上版本
随后在CMD

pip install Django

其他下载方式自行查阅
在交互解释器下输入校验代码能够看到版本号,说明安装成功。

>>> import django
>>>> django.__version__
'3.0.8'
>>> 

2.PyCharm创建项目

创建项目除了在命令提示符窗口创建项目之外,还可以在PyCharm中创建项目,本次介绍后者。
打开PyCharm并在左上方单击File->New Project,创建新项目,如图所示。

在这里插入图片描述
接着创建APP应用,可以在PyCharm的Terminal中输入创建指令。

在这里插入图片描述

完成项目和APP的创建后,启动项目。如果项目是由PyCharm创建的,就直接单击“运行”按钮启动项目。

在这里插入图片描述
测试成功,下面进入开发。

3.应用和模板配置

templates文件夹里新建index.html文件
在这里插入图片描述
打开MyDjango003文件夹的配置文件settings.py,找到配置属性INSTALLED_APPS和TEMPLATES,分别将项目应用user和模板文件夹templates添加到相应的配置属性,其配置如下所示:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 添加项目应用user
    'user'
]

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',
            ],
        },
    },
]

4.静态资源配置

在根目录文件夹中创建static静态资源文件夹。在配置文件settings.py中设置STATICFILES_DIRS属性。

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static'), ]

设置settings.py中 STATIC_ROOT 如下:

STATIC_ROOT = os.path.join(BASE_DIR, 'AllStatic')

STATIC_ROOT 在DEBUG为False,即进入生产环境,在服务器上部署项目时才会用到。

5.数据库配置

项目创建时默认使用Sqlite3数据库,这是一款轻型数据库,常用于嵌入式系统开发,而且占用资源非常少。所以本次使用大家常用的MySQL数据库。
配置MySQL之前需要安装mysqlclient模块,CMD输入:

pip install mysqlclient

也可使用其他方式。完成mysqlclient模块的安装后,在项目的配置文件settings.py中配置MySQL数据库连接信息,代码如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django003_db',
        'USER': 'root',
        'PASSWORD': '010116',
        'HOST': '127.0.0.1',
        'PORT': '3306'
        
    }
}

为了验证数据库连接信息是否正确,我们使用数据库可视化工具 Navicat Preminum 打开本地的MySQL 数据库,在本地的MySQL数据库创建数据库django003_db,如图所示。

在这里插入图片描述
刚创建的数据库django003_db是一个空白的数据库,接着在PyCharm的Terminal界面下输入如下Django操作指令来创建Django内置功能的数据表。

python manage.py migrate

在这里插入图片描述
最后在Navicat Premium 里查看数据库 django003_db是否生成相应的数据表。
在这里插入图片描述

6.中间件配置

一般情况下,Django默认的中间件配置均可满足大部分的开发需求。我们在项目的 MIDDLEWARE 中添加 LocaleMiddleware 中间件,使得Django内置的功能支持中文显示,代码如下:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    # 添加中间件 LocaleMiddleware
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

随意变更中间件顺序,很容易导致程序异常。

三、实现登录注册

Django内置了Auth认证系统。整个Auth认证系统可分为三大部分:用户信息、用户权限和用户组,在数据库中分别对应数据表auth_userauth_permissionauth_group

使用内置的Auth认证系统实现用户注册、登录和注销功能,使我们无需自定义用户模型。

模型映射数据库中的一张表,django.contrib.auth.models.User是django内置的用户模型,对应之前已经迁移完成的数据表auth_user

在这里插入图片描述

分别在 MyDjango003 的 urls.py和 user 的urls.py中定义路由信息。代码如下:

from django.contrib import admin
from django.urls import path, re_path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(('user.urls', 'user'), namespace='user')),
#user 的 urls.py

from django.urls import path
from .views import *

urlpatterns = [

    # 首页
    path('', indexView, name='index'),
    # 用户注册
    path('register.html', registerView, name='register'),
    # 用户登录
    path('login.html', loginView, name='login'),
    # 用户注销
    path('logout.html', logoutView, name='logout'),
    # 用户中心
    path('info.html', infoView, name='info'),
]

项目应用userurls.py中定义了5条路由信息,index路由为访问站点时展示的主页,register为用户注册操作,login为登录操作,logout为注销操作,info为登录后的个人中心展示。

然后在userviews.py中定义相关的视图函数,代码如下:
(这里我先导入所有需要用到的包、类、库、函数等,下文导包的代码将不再重复写入)

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.shortcuts import reverse
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.decorators import login_required

from user.form import ScheduleForm
from user.models import PersonInfo, Schedule


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


# 使用表单实现用户注册
def registerView(request):
    userLogin = False
    if request.method == 'POST':
        user = UserCreationForm(request.POST)
        if user.is_valid():
            user = user.save(commit=False)
            user.email = request.POST.get('em')
            user.save()
            tips = '注册成功'
            return redirect(reverse('user:login'))
        else:
            tips = '注册失败'
    user = UserCreationForm()
    return render(request, 'user.html', locals())


# 用户登录
def loginView(request):
    tips = '请登录'
    userLogin = True
    if request.method == 'POST':
        u = request.POST.get('username', '')
        p = request.POST.get('password1', '')
        if User.objects.filter(username=u):
            user = authenticate(username=u, password=p)
            if user:
                if user.is_active:
                    # 登录当前账户
                    login(request, user)
                return redirect(reverse('user:info'))
            else:
                tips = '账号密码错误,请重新输入'
        else:
            tips = '用户不存在,请注册'
    user = UserCreationForm()
    return render(request, 'user.html', locals())


# 退出登录
def logoutView(request):
    logout(request)
    return redirect(reverse('user:index'))


# 用户中心
# login_required 判断用户是否已登录
@login_required(login_url='/login.html')
def infoView(request):
    return render(request, 'info.html', locals())

然后在templates新建模板文件user.htmlindex.htmlinfo.html并编写网页代码,模板文件user.html主要生成用户注册和登录页面,模板文件info.html生成用户中心页面(共用一个模板但路由不同),三者的代码如下:

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    {% load static %}
    <link rel="stylesheet" href="{% static "css/common.css" %}">
    <link rel="stylesheet" href="{% static "css/home.css" %}">
    <title>student information system</title>
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
            <h1 class="profile__tit">
                <span class="profile__name" style="font-family: 幼圆">欢迎进入学生信息管理系统</span>
            </h1>
        </div>
    </div>
    <div style="height: 330px;">
    <div style="text-align: center;">
        <a href="{% url 'user:info' %}" ><button type="button" style="margin-top:30px;height:30px;width: 200px;background-color:aliceblue;border:1px silver solid;">开始</button></a>
        <br />
        <a href="{% url 'user:login' %}" ><button type="button" style="margin-top:30px;height:30px;width: 200px;background-color:aliceblue;border:1px silver solid;" name="b1" value="1">登录</button></a>
        <br />
        <a href="{% url 'user:register' %}" ><button type="button" style="margin-top:30px;height:30px;width: 200px;background-color:aliceblue;border:1px silver solid;">注册</button></a>
        <br />
    </div>
</div>
</body>
</html>

user.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <title>用户管理</title>
    <link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css">
</head>
<body>
<div class="flex-center">
    <div class="container">
    <div class="flex-center">
    <div class="unit-1-2 unit-1-on-mobile">
        {% if userLogin %}
            <h1>用户登录</h1>
        {% else %}
            <h1>用户注册</h1>
        {% endif %}
        {% if tips %}
            <div>{{ tips }}</div>
        {% endif %}
        <form class="form" action="" method="post">
            {% csrf_token %}
            <div>用户名:{{ user.username }}</div>
            <div>密  码:{{ user.password1 }}</div>
            {% if not userLogin %}
            <div>密码确认:{{ user.password2 }}</div>
            <div>邮  箱:{{ user.email }}</div>
            <input id="Text1" type="text" name="em" value=""/>
            {% endif %}
            <button type="submit" class="btn btn-primary btn-block">确 认</button>
        </form>
    </div>
    </div>
    </div>
</div>
</body>
</html>

info.html

<!doctype html>
<html>
<head>
{% load static %}
<title>个人信息板块</title>
<link rel="stylesheet" href="{% static "css/common.css" %}">
<link rel="stylesheet" href="{% static "css/home.css" %}">
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
        	{#模板上下文user是User或AnoymousUser对象#}
            {% if user.is_authenticated %}
            <div class="profile__cover_link">
                <img src="{% static "image/user.png" %}" class="profile__cover">
            </div>
            <h1 class="profile__tit">
                <span class="profile__name">{{ user.username }}</span>
            </h1>
                <a href="{% url 'user:logout' %}" style="color:white;">退出登录</a>
            {% endif %}
        </div>
    </div>
    <div style="text-align: center;">
        <div style="margin-top:50px;"><a href="infoManage.html"><button type="button" style="border:1px snow solid;width:250px; height:30px;background-color:mediumpurple;color:white"><span style="font-family: 黑体;">信息管理模块</span></button></a></div>
        <div style="margin-top:50px;"><a href="schedule.html"><button type="button" style="border:1px snow solid;width:250px; height:30px;background-color:mediumpurple;color:white"><span style="font-family: 黑体;">日程安排模块</span></button></a></div>
    </div>
</body>
</html>

四、学生信息管理模块

学生信息管理模块是用户登录后才能进行的操作,实现处理学生信息的增删改查操作。
首先需要定义学生信息模型。
user应用文件夹的models.py中定义学生信息模型,代码如下:

from django.db import models
from django.contrib.auth.models import User
# Create your models here.


class PersonInfo(models.Model):

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    major = models.CharField(max_length=20)
    sex = models.CharField(max_length=5)
    number = models.CharField(max_length=20)
    age = models.CharField(max_length=20)
    address = models.CharField(max_length=20)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '人员信息'

模型建立后需要进行数据迁移,这样才能在数据库中生成数据表。
在Terminal中执行代码:

>> python manage.py makemigrations
>> python manage.py migrate

navicat查看新增的数据表:
在这里插入图片描述
发现模型中的属性和user_schedule数据表的字段对应,这就是数据迁移:根据模型在数据库中生成新表,展现了映射关系。

随后需要提到表单这一概念,表单是搜集用户数据信息的各种表单元素的集合,其作用是实现网页上的数据交互,比如用户在网站输入数据信息,然后提交到网站服务器端进行处理(如数据录入和用户登录注册等)。
网页表单是Web开发的一项基本功能,Django的表单功能由Form类实现,主要分为两种,django.forms.Formdjango.forms.ModelForm。前者是一个基础的表单功能,后者是在前者的基础上结合模型所生成的数据表单。本次我们用到的是后者。

user应用文件夹创建文件夹form.py并定义学生信息表单,代码如下:

from django import forms
from .models import PersonInfo, Schedule


class PersonInfoForm(forms.ModelForm):
    class Meta:
        model = PersonInfo
        fields = '__all__'
        labels = {
            'id': ' 学号',
            'name': '姓名',
            'major': '专业',
            'sex': '性别',
            'number': '手机号',
            'age': '年龄',
            'address': '家庭地址',
        }

user文件夹的urls.py中添加path:

# 信息管理模块
    path('infoManage.html', infoManageView, name='infoManage'),
    # 新增信息
    path('create.html', createView, name='create'),
    # 修改信息
    path('update.html', updateView, name='update'),
    # 删除信息
    path('delete.html', delInfoView, name='delete'),
    # 查询信息
    path('query.html', queryView, name='query'),

infoManage路由代表的学生信息管理模块是info路由中个人中心页面里的2个模块之一,它包含增删改查页面的链接,另一个模块是后续开发的日程安排模块。也就是说info页面包含了2个模块的链接,其中的学生信息管理模块由包含4个链接。

view.py中添加基于FBV的视图函数,代码如下:

@login_required(login_url='/login.html')
def infoManageView(request):
    return render(request, 'infoManage.html', locals())


@login_required(login_url='/login.html')
def createView(request):
    title = '学生信息新增模块'
    if request.method == 'POST':
        name = request.POST.get('name', '')
        major = request.POST.get('major', '')
        sex = request.POST.get('sex', '')
        number = request.POST.get('number', '')
        age = request.POST.get('age', '')
        address = request.POST.get('address', '')
        if all([name, major, sex, number, age, address]):
            d = dict(name=name, major=major, sex=sex, number=number, age=age, address=address)
            v = PersonInfo.objects.create(**d)
            tips = '新增 ' + str(v.name) + ' 信息成功!'
        else:
            tips = '所有选项为必填项!'
    return render(request, 'create.html', locals())


# 修改学生信息
@login_required(login_url='/login.html')
def updateView(request):
    title = '学生信息修改模块'
    if request.method == 'POST':
        name = request.POST.get('name', '')
        major = request.POST.get('major', '')
        sex = request.POST.get('sex', '')
        number = request.POST.get('number', '')
        age = request.POST.get('age', '')
        address = request.POST.get('address', '')
        if all([name, major, sex, number, age, address]):
            p = PersonInfo.objects.filter(name=name)
            if len(p):
                d = dict(name=name, major=major, sex=sex, number=number, age=age, address=address)
                PersonInfo.objects.filter(name=name).update(**d)
                tips = '修改 ' + str(p[0].name) + ' 信息成功!'
            else:
                tips = '修改失败,未找到该学生!'

        else:
            tips = '所有选项为必填项!'
    return render(request, 'update.html', locals())


# 删除学生信息
@login_required(login_url='/login.html')
def delInfoView(request):
    title = '学生信息删除模块'
    if request.method == 'POST':
        name = request.POST.get('name','')
        print('!'+name+'!')
        if name:
            summ = PersonInfo.objects.filter(name=name)
            num = len(list(summ))
            if num:
                summ.delete()
                # PersonInfo.objects.filter(name=name).delete()
                tips = '删除成功!共删除' + str(num) + '条数据!'
                return render(request, 'delete.html', locals())
            else:
                tips = "不存在该学生!"
        else:
            tips = "删除的名字不能为空!"
    return render(request, 'delete.html', locals())


# 查询学生信息
@login_required(login_url='/login.html')
def queryView(request):
    title = '学生信息查询模块'
    if request.method == 'POST':
        name = request.POST.get('name', '')
        if name:
            p = PersonInfo.objects.filter(name=name)
            num = len(list(p))
            print(num)
            if num == 0:
                tips = '未找到该学生信息!'
            return render(request, 'query.html', locals())
        else:
            tips = "查询的名字不能为空!"
            return render(request, 'query.html', locals())
    p = PersonInfo.objects.all()
    return render(request, 'query.html', locals())

templates文件夹中创建增删改查和学生信息管理模块主页对应的模板文件infoManage.htmlcreate.htmlupdate.htmlquery.htmldelete.html

infoManage.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% load static %}
    <title>学生信息管理系统</title>
    <link rel="stylesheet" href="{% static "css/common.css" %}">
    <link rel="stylesheet" href="{% static "css/home.css" %}">
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
        	{#模板上下文user是User或AnoymousUser对象#}
            {% if user.is_authenticated %}
            <div class="profile__cover_link">
                <img src="{% static "image/user.png" %}" class="profile__cover">
            </div>
            <h1 class="profile__tit">
                <span class="profile__name">{{ user.username }}</span>
            </h1>
                <a href="{% url 'user:logout' %}" style="color:white;">退出登录</a>
            {% endif %}
        </div>
    </div>
    <div style="height:500px;text-align: center;">
        <div style="text-align: center;"><span style="font-family: 幼圆;font-size: 40px;">学生信息管理系统</span></div>
        <div style="margin-top:50px;"><a href="create.html"><button type="button" style="border:1px snow solid;width:250px; height:30px;background-color:mediumpurple;color:white"><span style="font-family: 黑体;">添加学生信息</span></button></a></div>
        <div style="margin-top:50px;"><a href="update.html"><button type="button" style="border:1px snow solid;width:250px; height:30px;background-color:mediumpurple;color:white"><span style="font-family: 黑体;">修改学生信息</span></button></a></div>
        <div style="margin-top:50px;"><a href="query.html"><button type="button" style="border:1px snow solid;width:250px; height:30px;background-color:mediumpurple;color:white"><span style="font-family: 黑体;">查询学生信息</span></button></a></div>
        <div style="margin-top:50px;"><a href="delete.html"><button type="button" style="border:1px snow solid;width:250px; height:30px;background-color:mediumpurple;color:white"><span style="font-family: 黑体;">删除学生信息</span></button></a></div>
    </div>
</body>
</html>

create.html

<!DOCTYPE html>
<html lang="en">
<head>
    {% load static %}
    <meta charset="UTF-8">
    <title>{{ title }}</title>
    <link rel="stylesheet" href="{% static "css/common.css" %}">
    <link rel="stylesheet" href="{% static "css/home.css" %}">
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
        	{#模板上下文user是User或AnoymousUser对象#}
            {% if user.is_authenticated %}
            <div class="profile__cover_link">
                <img src="{% static "image/user.png" %}" class="profile__cover">
            </div>
            <h1 class="profile__tit">
                <span class="profile__name">{{ user.username }}</span>
            </h1>
                <a href="{% url 'user:logout' %}" style="color:white;">退出登录</a>
            {% endif %}
        </div>
    </div>
    <div style="text-align: center;height: 500px;">
    <div style="margin-bottom: 50px;"><span style="font-family: 幼圆;font-size: 36px">{{ title }}</span><a href="{% url 'user:info' %}"><span style="font-family: 幼圆;font-size: 14px;">&emsp;&emsp;回到个人主页</span></a></div>
    <form method="post">
        {% csrf_token %}
        <span>输入姓名以新增学生的个人信息:</span><br>
        <span style="font-size: 20px;font-family: 幼圆">姓名</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="name" value="{{ name }}"><br>
        <span style="font-size: 20px;font-family: 幼圆">专业</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="major" value="{{ major }}"><br>
        <span style="font-size: 20px;font-family: 幼圆">性别</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="sex" value="{{ sex }}"><br>
        <span style="font-size: 20px;font-family: 幼圆">手机号</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="number" value="{{ number }}"><br>
        <span style="font-size: 20px;font-family: 幼圆">年龄</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="age" value="{{ age }}"><br>
        <span style="font-size: 20px;font-family: 幼圆">家庭地址</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="address" value="{{ address }}"><br>
        {% if tips %}
            <span>{{ tips }}</span>
        {% endif %}
        <br>
        <input style="width: 80px;height: 30px;background-color: #008ef5;color: white;border: #c9c9c9" type="submit" value="确定">
    </form>
</div>
</body>
</html>

update.html

<!DOCTYPE html>
<html lang="en">
<head>
    {% load static %}
    <meta charset="UTF-8">
    <title>{{ title }}</title>
    <link rel="stylesheet" href="{% static "css/common.css" %}">
    <link rel="stylesheet" href="{% static "css/home.css" %}">
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
        	{#模板上下文user是User或AnoymousUser对象#}
            {% if user.is_authenticated %}
            <div class="profile__cover_link">
                <img src="{% static "image/user.png" %}" class="profile__cover">
            </div>
            <h1 class="profile__tit">
                <span class="profile__name">{{ user.username }}</span>
            </h1>
                <a href="{% url 'user:logout' %}" style="color:white;">退出登录</a>
            {% endif %}
        </div>
    </div>
    <div style="text-align: center;height: 500px;">
    <div style="margin-bottom: 50px;"><span style="font-family: 幼圆;font-size: 36px">{{ title }}</span><a href="{% url 'user:info' %}"><span style="font-family: 幼圆;font-size: 14px;">&emsp;&emsp;回到个人主页</span></a></div>
    <form method="post">
        {% csrf_token %}
        <span>输入姓名以修改学生的个人信息:</span><br>
        <span>姓名</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="name" value="{{ name }}"><br>
        <span>专业</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="major" value="{{ major }}"><br>
        <span>性别</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="sex" value="{{ sex }}"><br>
        <span>手机号</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="number" value="{{ number }}"><br>
        <span>年龄</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="age" value="{{ age }}"><br>
        <span>家庭地址</span><input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="address" value="{{ address }}"><br>
        {% if tips %}
            <span>{{ tips }}</span>
        {% endif %}
        <br>
        <input style="width: 80px;height: 30px;background-color: #008ef5;color: white;border: #c9c9c9" type="submit" value="确定">
    </form>
</div>
</body>

</html>

query.html

<!DOCTYPE html>
<html lang="en">
<head>
    {% load static %}
    <meta charset="UTF-8">
    <title>{{ title }}</title>
    <link rel="stylesheet" href="{% static "css/common.css" %}">
    <link rel="stylesheet" href="{% static "css/home.css" %}">
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
        	{#模板上下文user是User或AnoymousUser对象#}
            {% if user.is_authenticated %}
            <div class="profile__cover_link">
                <img src="{% static "image/user.png" %}" class="profile__cover">
            </div>
            <h1 class="profile__tit">
                <span class="profile__name">{{ user.username }}</span>
            </h1>
                <a href="{% url 'user:logout' %}" style="color:white;">退出登录</a>
            {% endif %}
        </div>
    </div>
    <div style="text-align: center;margin-bottom: 50px;"><span style="font-family: 幼圆;font-size: 36px">{{ title }}</span><a href="{% url 'user:info' %}"><span style="font-family: 幼圆;font-size: 14px;">&emsp;&emsp;回到个人主页</span></a></div>
    <div style="padding-left: 40%;margin-bottom: 100px;">
    <form method="post">
        {% csrf_token %}
        <span>输入姓名以查询该学生的个人信息:</span>
        <input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="name">
        <input style="width: 80px;height: 30px;background-color: #008ef5;color: white;border: #c9c9c9" type="submit" value="确定">
        {% if tips %}
            <span>{{ tips }}</span>
        {% endif %}
        <br>
        <br>
        <table border="1">
            <tr>
                <th>姓名</th>
                <th>专业</th>
                <th>性别</th>
                <th>手机号</th>
                <th>年龄</th>
                <th>家庭地址</th>
            </tr>
            {% for i in p %}
            <tr>
                <th>{{ i.name }}</th>
                <th>{{ i.major }}</th>
                <th>{{ i.sex }}</th>
                <th>{{ i.number }}</th>
                <th>{{ i.age }}</th>
                <th>{{ i.address }}</th>
            </tr>
            {% endfor %}
        </table>
    </form>
</div>
</body>
</html>

delete.html

<!DOCTYPE html>
<html lang="en">
<head>
    {% load static %}
    <meta charset="UTF-8">
    <title>{{ title }}</title>
    <link rel="stylesheet" href="{% static "css/common.css" %}">
    <link rel="stylesheet" href="{% static "css/home.css" %}">
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
        	{#模板上下文user是User或AnoymousUser对象#}
            {% if user.is_authenticated %}
            <div class="profile__cover_link">
                <img src="{% static "image/user.png" %}" class="profile__cover">
            </div>
            <h1 class="profile__tit">
                <span class="profile__name">{{ user.username }}</span>
            </h1>
                <a href="{% url 'user:logout' %}" style="color:white;">退出登录</a>
            {% endif %}
        </div>
    </div>
    <div style="text-align: center;height: 500px;">
    <div style="margin-bottom: 50px;"><span style="font-family: 幼圆;font-size: 36px">{{ title }}</span><a href="{% url 'user:info' %}"><span style="font-family: 幼圆;font-size: 14px;">&emsp;&emsp;回到个人主页</span></a></div>
    <form method="post">
        {% csrf_token %}
        <span>输入姓名以删除该学生的个人信息:</span>
        <input style="margin-left:3px;height: 30px;width: 200px;margin-bottom: 5px;" type="text" name="name">
        <input style="width: 80px;height: 30px;background-color: #008ef5;color: white;border: #c9c9c9" type="submit" value="确定">
        {% if tips %}
            <span>{{ tips }}</span>
        {% endif %}
    </form>
</div>
</body>

</html>

这样,我们就已经定义了模型、表单、路由、视图、模板,学生信息管理模块就可以正常运行了。

五、日程安排模块

同理,首先定义日程安排模型,对应登录用户的日程安排表。
models.py中添加模型代码如下:

class Schedule(models.Model):

    id = models.AutoField(primary_key = True)
    title = models.CharField(max_length=20)
    content = models.TextField()
    beginDate = models.DateField()
    endDate = models.DateField()
    person = models.ForeignKey(User,on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '日程信息'

模型建立后需要进行数据迁移,这样才能在数据库中生成数据表。
在Terminal中执行代码:

>> python manage.py makemigrations
>> python manage.py migrate

navicat查看新增的数据表:
在这里插入图片描述
发现除了模型中的属性和user_schedule数据表的字段对应之外,person字段在数据表中表现为person_id,因为该字段是模型的外键属性,user_schedule数据表关联到用户表auth_user形成一对多的关系,即一个用户可以有多个日程。

随后在form.py中添加日程安排模型对应的表单类,代码如下:

class ScheduleForm(forms.ModelForm):

    class Meta:
        model = Schedule
        labels = {
            'title': '标题',
            'content': '内容',
            'beginDate': '开始时间',
            'endDate': '结束时间',
        }
        exclude = ['person']
        field_classes = {
            'beginDate': forms.DateField,
            'endDate': forms.DateField
        }
        help_texts = {
            'title': '请输入标题名称'
        }

user文件夹的urls.py的urlpatterns列表中添加path:

	# 日程安排模块
    path('schedule.html', scheduleView, name='schedule'),

该模块为info.html中展示的2个模块之一,上一个模块为学生信息管理模块。
views.py中添加日程安排模块的后端逻辑代码:

@login_required(login_url='/login.html')
def scheduleView(request):
    if request.method == 'GET':
        v = ScheduleForm()
        p = Schedule.objects.filter(person_id=request.user.id)
        return render(request, 'schedule.html', locals())
    else:
        v = ScheduleForm(data=request.POST)
        v1 = v.save(commit=False)
        v1.person_id = request.user.id
        v1.save()
        tips = '新增日程成功!'
        p = Schedule.objects.filter(person_id=request.user.id)
        return render(request, 'schedule.html', locals())

最后在templates文件夹中添加模板文件schedule.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% load static %}
    <title>日程安排模块</title>
    <link rel="stylesheet" href="{% static "css/common.css" %}">
    <link rel="stylesheet" href="{% static "css/home.css" %}">
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
        	{#模板上下文user是User或AnoymousUser对象#}
            {% if user.is_authenticated %}
            <div class="profile__cover_link">
                <img src="{% static "image/user.png" %}" class="profile__cover">
            </div>
            <h1 class="profile__tit">
                <span class="profile__name">{{ user.username }}</span>
            </h1>
                <a href="{% url 'user:logout' %}" style="color:white;">退出登录</a>
            {% endif %}
        </div>
    </div>
    <div style="text-align: center;"><span style="font-family: 幼圆;font-size: 40px;">日程安排</span><a href="{% url 'user:info' %}"><span style="font-family: 幼圆;font-size: 14px;">&emsp;&emsp;回到个人主页</span></a></div>

    <div style="padding-left: 40%;margin-bottom: 100px;">
        {% if v.errors %}
        <p>数据出错啦,错误信息:{{ v.errors }}</p>
    {% else %}
            <div><span style="font-family: 黑体;font-size: 22px;">在此添加新的日程安排</span></div>
        <form action="" method="post">
        {% csrf_token %}
        <table>
            {{ v.as_table }}
        </table>
            <br>
            <input type="hidden" value="{{ user.username }}" name="username">
        <input type="submit" value="提交" style="width: 200px;height: 30px;">
        {% if tips %}
            <span>{{ tips }}</span>
        {% endif %}
        </form>
    {% endif %}
        <div style="margin-top: 50px;">
            <span style="font-family: 幼圆;font-size: 22px;">当前日程安排</span>
        </div>
        <div style="margin-top: 30px;">
            <ul>
                {% for i in p %}
                    <li style="font-family: 幼圆;font-size: 26px;">标题:{{ i.title }}</li>
                    <li style="font-family: 幼圆;font-size: 16px;">{{ i.content }}</li>
                    <li style="font-family: 幼圆;font-size: 14px;">开始时间:{{ i.beginDate }}</li>
                    <li style="font-family: 幼圆;font-size: 14px;">结束时间:{{ i.endDate }}</li>
                    <div style="height: 50px;"></div>
                {% endfor %}
            </ul>
        </div>
    </div>
</body>
</html>

这样,我们就已经定义了模型、表单、路由、视图、模板,日程安排模块就可以正常运行了,课设要求也已经满足。

六、项目文件结构

理一理项目结构,防文件缺失。
在这里插入图片描述

七、成品预览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、项目源代码

Github:
https://github.com/yulaw-k/information-management-system-based-on-Djano.git


总结

以上就是今天要讲的内容,本文仅仅简单介绍了Django的简单开发流程,进行相关配置后分别编写模型、表单、路由、视图、模板代码即可实现基于web的信息管理系统。django还内置更多功能,比如分页功能,admin后台系统,消息框架,并支持多种插件和第三方应用。
  • 31
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值