Django 练习班级管理系统一

创建项目 user_manager 和 app为 app01

models.py 为

from django.db import models

# Create your models here.

class Classes(models.Model):
    caption = models.CharField(max_length=32)

class Student(models.Model):
    name = models.CharField(max_length=32)
    cls = models.ForeignKey(Classes, on_delete=models.CASCADE)

class Teacher(models.Model):
    name = models.CharField(max_length=32)
    cls = models.ForeignKey(Classes, on_delete=models.CASCADE)

class Administrator(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

views.py 为

from django.shortcuts import render, redirect, HttpResponse

# Create your views here.
from app01 import models
from django import views
from django.utils.decorators import method_decorator

# 登录函数
class Login(views.View):
    # 可以重写 dispatch 函数,达到装饰器的效果
    def dispatch(self, request, *args, **kwargs):
        # print(11111111111)
        ret = super(Login, self).dispatch(request, *args, **kwargs)
        # print(22222222222)
        return ret

    def get(self, request, *args, **kwargs):
        print('GET')
        return render(request, 'login.html', {'msg': ''})

    def post(self, request, *args, **kwargs):
        print('POST')
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        # 验证用户名和密码是否正确
        c = models.Administrator.objects.filter(username=user, password=pwd).count()
        if c:
            # 设置了 session
            request.session['is_login'] = True
            request.session['username'] = user
            # redirect 到 index.html 页面
            rep = redirect('/index.html')
            return rep
        else:
            # 登录失败,跳转回 login.html 页面
            message = "用户名或密码错误"
            return render(request, 'login.html', {'msg': message})

# 装饰器,用来验证用户是否登录
def auth(func):
    def inner(request, *args, **kwargs):
        # 获取 session 中的 is_login 值,没有值则跳转回 login.html 页面
        is_login = request.session.get('is_login')
        if is_login:
            return func(request, *args, **kwargs)
        else:
            return redirect('/login.html')
    return inner

# 登录后的首页,通过 session 获取 username,如果不使用装饰器就得每个方法都得写一遍验证方法。
def index(request):
    current_username = request.session.get('username')
    if current_username:
        return render(request, 'index.html', {'username': current_username})
    else:
        return redirect('/login.html')

@auth
def handle_classes(request):
    if request.method == "GET":
        current_user = request.session.get('username')
        # 插入记录
        # models.Classes.objects.create(caption='全栈一班')
        # models.Classes.objects.create(caption='全栈二班')
        # models.Classes.objects.create(caption='全栈三班')
        # 获取所有的班级列表
        cls_list = models.Classes.objects.all()
        return render(request,
                      'classes.html',
                      {'username': current_user, 'cls_list': cls_list})

    elif request.method == "POST":
        # Form 表单提交的处理方式
        """
        caption = request.POST.get('caption', None)
        models.Classes.objects.create(caption=caption)
        return redirect('/classes.html')
        """
        # Ajax 提交的方式处理
        import json
        response_dict = {'status': True, 'error': None, 'data': None}
        # 获取 caption
        caption = request.POST.get('caption', None)
        if caption:
            # 创建记录
            obj = models.Classes.objects.create(caption=caption)
            # print(obj.id)
            # print(obj.caption)
            # 返回包含 id 和 caption 的字典
            response_dict['data'] = {'id': obj.id, 'caption': obj.caption}
        else:
            response_dict['status'] = False
            response_dict['error'] = "标题不能为空"
        return HttpResponse(json.dumps(response_dict))

def handle_teacher(request):
    is_login = request.session.get('is_login')
    if is_login:
        current_user = request.session.get('username')
        return render(request, 'teacher.html', {'username':current_user})
    else:
        return redirect('/login.html')

def handle_student(request):
    is_login = request.session.get('is_login')
    if is_login:
        current_user = request.session.get('username')
        return render(request, 'student.html', {'username':current_user})
    else:
        return redirect('/login.html')

settings.py 修改

# 在 MIDDLEWARE  下注释
#'django.middleware.csrf.CsrfViewMiddleware',

# 在最后添加
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

urls.py 为

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login.html', views.Login.as_view()),
    path('index.html', views.index),
    path('classes.html', views.handle_classes),
    path('student.html', views.handle_student),
    path('teacher.html', views.handle_teacher),
]

添加一个 templates 文件夹,里面增加下面 html 文件
layout.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body{
            margin: 0;
        }

        .hide{
            display: none;
        }
        .menu .item{
            display: block;
            padding: 5px 10px;
            border-bottom: 1px solid #dddddd;
        }
        .menu .item:hover{
            background-color: black;
            color: white;
        }
        .menu .item.active{
            background-color: black;
            color: white;
        }

        .modal{
            position: fixed;
            top: 50%;
            left: 50%;
            width: 500px;
            height: 400px;
            margin-top: -250px;
            margin-left: -250px;
            z-index: 100;
            background-color: white;
        }

        .shade{
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background-color: black;
            opacity: 0.5;
            z-index: 99;
        }

        .remove{
            position: fixed;
            top: 50%;
            left: 50%;
            width: 400px;
            height: 200px;
            margin-top: -100px;
            margin-left: -200px;
            z-index: 100;
            background-color: #cc0000;
        }
        {% block css %} {% endblock %}
    </style>
</head>
<body>
    <div style="height: 48px; background-color: black; color: white">
        <div style="float: right">用户名: {{ username }} | <a href="/logout.html">注销</a></div>
    </div>

    <div>
        <div class="menu" style="position: absolute; top:48px; left: 0; bottom: 0; width: 200px; background-color: #eee">
            <a id="menu_class" class="item" href="classes.html">班级管理</a>
            <a id="menu_student" class="item" href="student.html">学生管理</a>
            <a id="menu_teacher" class="item" href="teacher.html">老师管理</a>
        </div>
        <div style="position: absolute; top:48px; left: 200px; bottom:0; right: 0; overflow: auto">
            {% block content %} {% endblock %}
        </div>

    </div>
    <script src="/static/jquery.min.js"></script>

{% block js %} {% endblock %}
</body>
</html>

index.html

{% extends "layout.html" %}

{% block css %}
{% endblock %}

{% block content %}
    <h1>欢迎使用管理中心</h1>
{% endblock %}

{% block js %}
{% endblock %}

classes.html

{% extends "layout.html" %}

{% block css %}
{% endblock %}

{% block content %}
    <h1>班级管理</h1>
    <div>
        <input id="id_add" type="button" value="添加">
    </div>
    <table border="1">
        <thead>
            <tr>
                <th>ID</th>
                <th>标题</th>
            </tr>
        </thead>
        <tbody>
            {% for item in cls_list %}
                <tr>
                    <td>{{ item.id }}</td>
                    <td>{{ item.caption }}</td>
                    <td>
                        <a>编辑</a>|<a class="td-delete">删除</a>
                    </td>
                </tr>
            {% endfor %}
        </tbody>
    </table>

    <div class="modal hide">
        <form method="post" action="/classes.html">
            {% csrf_token %}
            <input name="caption" type="text" placeholder="标题">
            <input id="id_modal_cancel" type="button" value="取消">
            <input type="submit" value="确定">
            <input type="button" id="modal_ajax_submit" value="Ajax确定">
        </form>
    </div>
    <div class="shade hide"></div>
    <div class="remove hide">
        <input id="id_remove_cancel" type="button" value="取消">
        <input type="button" value="确定">
    </div>
{% endblock %}

{% block js %}
    <script>
        // 进入页面之间调用下面的方法
        $(function () {
            $('#menu_class').addClass('active');
            // 绑定 click 事件
            bindAddEvent();
            bindCancelEvent();
            bindTdDeleteEvent();
            bindSubmitModal();
        })

        function bindAddEvent() {
            $('#id_add').click(function () {
                $('.modal, .shade').removeClass('hide')
            })

        }

        function bindCancelEvent() {
            $('#id_modal_cancel').click(function () {
                $('.modal, .shade').addClass('hide')
            })

        }

        function bindTdDeleteEvent() {
            /* 新建的 td 没有绑定 click 事件
            $('td .td-delete').click(function () {
                $('.remove, .shade').removeClass('hide')
            })
            */
            // 使用 js 的事件绑定委托
            $('tbody').on('click', '.td-delete', function () {
                $('.remove, .shade').removeClass('hide')
            })
        }

        function bindSubmitModal() {
            $('#modal_ajax_submit').click(function () {
                var value = $('.modal input[name="caption"]').val();
                $.ajax({
                    url: "/classes.html",
                    type: 'POST',
                    data: {caption: value},
                    dataType: "JSON",
                    // 成功返回 rep
                    success: function (rep) {
                        if(!rep.status){
                            alert(rep.error)
                        }else{
                            // 通过刷新整个界面来显示新数据
                            //location.reload();

                            // 通过js 在 table 表格最后追加一行数据,追加的数据就是当前增加的数据
                            var tr = document.createElement('tr');
                            var td1 = document.createElement('td');
                            td1.innerHTML = rep.data.id;
                            var td2 = document.createElement('td');
                            td2.innerHTML = rep.data.caption;
                            var td3 = document.createElement('td');
                            td3.innerText = "|";
                            var a1 = document.createElement('a');
                            a1.innerHTML = "编辑";
                            var a2 = document.createElement('a');
                            a2.className = "td-delete";
                            a2.innerHTML = "删除";
                            $(td3).prepend(a1);
                            $(td3).append(a2);
                            $(tr).append(td1);
                            $(tr).append(td2);
                            $(tr).append(td3);
                            $('table tbody').append(tr);
                            $('.modal, .shade').addClass('hide');

                        }
                    }
                })

            })

        }

    </script>
{% endblock %}

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="login.html" method="post">
    {% csrf_token %}
    <div>
        <label for="user">用户名: </label>
        <input id="user" type="text" name="user">
    </div>
    <div>
        <label for="pwd">密码: </label>
        <input id="pwd" type="password" name="pwd">
    </div>
    <div>
        <label></label>
        <input type="submit" value="登录">
        <span style="color: red;">{{ msg }}</span>
    </div>
</form>

</body>
</html>

student.html

{% extends "layout.html" %}

{% block css %}
{% endblock %}

{% block content %}
    <h1>学生列表</h1>
{% endblock %}

{% block js %}
    <script>
        $(function () {
            $('#menu_student').addClass('active');
        })
    </script>
{% endblock %}

teacher.html

{% extends "layout.html" %}

{% block css %}
{% endblock %}

{% block content %}
    <h1>老师列表</h1>
{% endblock %}

{% block js %}
    <script>
        $(function () {
            $('#menu_teacher').addClass('active');

        })

    </script>
{% endblock %}

创建一个 static 文件夹,把 jquery.min.js 放进去

#生成同步数据库的脚本:
python manage.py makemigrations  

#同步数据库:
python manage.py migrate

# 启动
python manage.py runserver 8000

效果:

原文地址:https://www.cnblogs.com/klvchen/p/11078174.html

时间: 2024-11-14 12:56:52

Django 练习班级管理系统一的相关文章

Django 练习班级管理系统二 -- 添加班级数据

在上一篇中(Django 练习班级管理系统一 https://www.cnblogs.com/klvchen/p/11078174.html),使用的是莫泰对话框的方式提交数据,适用于数据量少的操作.若业务需要数据多,数据量大的操作,可以使用单独页面进行添加,下面是具体例子: 在 classes.html 页面下修改 a 标签: <h1>班级管理</h1> <div> <input id="id_add" type="button&q

step byt step之餐饮管理系统一

之前写过2015年的工作计划,其中有一项就是写一套管理系统,一来可以练练手,二来可以加强自己的学习,三来可以多园友多交流,共同进步.所以从今天开始把写系统的过程记录下来.先需求分析开始. 第一部分 引言 一.编写目的 1.此分析说明书整理餐饮收银系统中的需求,为后面的系统设计作准备,也就是描述了项目设计的要求. 二.背景 1.名称:餐饮管理系统,英文缩写名:RMS(restaurant manager system). 2.任务提出者:LZ 开发者:LZ, 本系统将实现客人进入餐饮邢台,点菜,传

网页管理系统一

一直想写个网页管理系统,可是陷入技术陷阱,总在研究技术,其实如今想想简单的东西应该简单的做. 一步步进行修改,逐渐改版. 现在写下来目标与过程,请通我一起进步. 目的:创建一个简单的带有  新闻 产品 留言 关于的简单新闻系统. 系统分析 一. 功能 用户 用户添加 删除 修改 查找所有用户 用户名查找 序号查找 角色表 新闻(列表,详细)附件(zip,doc,rar) 添加 编辑 删除 查找所有 序号序号  分类查找 分页查找  审核 新闻分类 增删改查 sqlds实现 产品(列表,详细)图片

关系型数据管理系统一 SQL概念与操作

目录 一.几个定义注意点 二.SQL操作语句备忘录 三.补充SQL约束 (本文是中科院陈世敏老师课程学习笔记) ----------------------------------------- 一.几个定义注意点 1.Scheme 对表格每一列的类型声明,只需定义一次 eg:新建表格定义scheme create table Student (    ID integer,    Name varchar(20),    GPA float  ); 2.Primary Key 可以包含多个属性

Django 练习班级管理系统五 -- 查看老师列表

models.py 对应的配置 class Classes(models.Model): caption = models.CharField(max_length=32) class Teacher(models.Model): name = models.CharField(max_length=32) cls = models.ManyToManyField('Classes') 修改 views.py @auth def handle_teacher(request): current_

自己开发的工作流引擎

辞职了,很久没写文章了,我的工作流项目烂了,是团队烂了:我现在想把这套东西贴出来,希望大家吐个槽:望大家不吝指点! android暂未完成,ios还未开发 工作流引擎设计工具我是使用wpf做的一个客户端程序,能可视化的设计流程l: 整个流程的跑动是asp.net做的,并提供了相应的接口,便于移动端调用! 先看看整个项目的截图把: 1)流程设计工具,用户身份验证,根据登陆用户获取隶属于该用户能操作的流程模板,请求wcf来进行身份验证: 2)这个是验证后获取用户具有权限的工作流模板:(1)为流程模板

2017年最新老男孩教育python视频全栈课程+源码笔记

官方网址:http://www.oldboyedu.com 网盘地址:2017年最新老男孩教育python视频自动化课程链接: http://pan.baidu.com/s/1mimH1PY 密码: d8ff 04-Python的发展05-Python特性介绍及与其它语言对比06-Python安装及环境准备07-编程风格要求08-Python的数据类型和运算符09-单行和多行注释10-理解ASSIC Unicode UTF-8编码11-使用和导入模块12-用户交互和格式化输出13-流程控制if

BAT解密:互联网技术发展之路(5)- 开发层技术剖析

BAT解密:互联网技术发展之路(5)- 开发层技术剖析 1. 开发框架 在系列文章的第2篇"BAT解密:互联网技术发展之路(2)- 业务怎样驱动技术发展"中我们深入分析了互联网业务发展的一个特点:复杂性越来越高. 复杂性添加的典型现象就是系统越来越多,不同的系统由不同的小组开发. 假设每一个小组用不同的开发框架和技术,将会带来非常多问题.典型的问题有: 1)技术人员之间没有共同的技术语言,交流合作少 2)每类技术都须要投入大量的人力和资源和熟练精通 3)不同团队之间人员无法高速流动,人

一张图概括互联网公司的标准技术架构

大部分人对于BAT的技术有一种莫名的崇拜感,觉得只有非常牛逼和天才才能做出现在的这些系统,但经过前面两篇博文的分析,我们可以看到其实并没有什么神秘的力量和魔力融合在技术里面,而是业务的不断发展推动技术的不断发展,一步一个脚印,持续几年甚至十几年的发展,才能达到当前技术复杂度.先进性.牛逼度. BAT解密(一):聊聊技术发展的驱动力 BAT解密(二):聊聊业务如何驱动技术发展 抛开BAT各自差异很大的业务,站在技术的角度来看,其实BAT的技术架构基本是一样的,再将视角放大,你会发现整个互联网行业的