Django实现对数据库数据增删改查(二)

目录

1.基本框架

1.1.路由分发

1.2.视图函数-逻辑处理

1.3.模板

2.查询功能

2.1.视图函数

2.2.模板函数

3.添加功能 

3.1.路由分发

3.2视图函数

3.3.模板

4.编辑功能

4.1路由分发

4.2.视图函数

4.3.公共函数

4.4.模板

4.5.视图函数优化1

4.6.视图函数优化2


接着对 Django实现对数据库数据增删改查(一)的继续深入,接着对学生管理系统继续补充。之前的文中展示了去数据库中“一对多”的关系,本文实现“多对多”的逻辑关系

1.基本框架

1.1.路由分发

在studentManagementSystem.urls中新增对于学生信息的路由

    url(r'^students/', views.students),

1.2.视图函数-逻辑处理

在studentManagementSys/app01/views.py中新增

def students(request):
    return render(request,'students.html')

1.3.模板

在template下新建一个students.html模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 <h1>学生列表</h1>
    <div>
        <a ">添加</a>
    </div>

    <table>
        <thead>
        <tr>
            <th>ID</th>
            <th>班级姓名</th>
            <th>所属班级</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>

        </tbody>
    </table>
</body>
</html>

视图展示如下:

现在有了以上的“骨架”之后,需要做的就是将对对应的数据进行填充,就是丰富其框架

2.查询功能

按照上面展示信息,需要展示学生的id,所属班级,那现在有个学生表和有个班级表

所以这里使用一个联合查询的功能

select student.id,student.name,class.title from student left JOIN class on student.class_id= class.id"

这样可以丰富view.py中的student函数了

2.1.视图函数

def students(request):
    """
    学生列表
    :param request:封装请求相关的所有信息
    :return:
    """
    # 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                           db='studentmanagement',charset='utf8')
    # 创建游标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 执行SQL,并返回收影响行数
    cursor.execute("select student.id,student.name,class.title from student left JOIN class on student.class_id= class.id")
    student_list =cursor.fetchall()
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

    return render(request,'students.html',{'student_list':student_list})

2.2.模板函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h1>学生列表</h1>
    <div>
        <a >添加</a>
    </div>

    <table>
        <thead>
        <tr>
            <th>学生ID</th>
            <th>学生姓名</th>
            <th>所属班级</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for row in student_list %}
            <tr>
                <td>{{ row.id }}</td>
                <td>{{ row.name }}</td>
                <td>{{ row.title }}</td>
                <td>
                    <a >编辑</a>
                    |
                    <a>删除</a>
                </td>

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

输出界面展示如下:

3.添加功能 

3.1.路由分发

在url中新增,add_student

url(r'^add_student/',views.add_student),

3.2视图函数

def add_student(request):
    return render(request,"add_student.html)

3.3.模板

新增一个add_student.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>添加学生</h1>
</body>
</html>

这里关于学生的添加,需要添加哪些东西是需要考虑的:

  • 学生姓名
  • 学生所属班级

那这里就需要考虑,姓名可以输入,但是班级是固定的,此时就需要从已有的班级中进行选择,就像每年开学报名一样,班级都是固定的,每个班级学生可以不固定,所以对add_student.html文件进行优化如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>添加学生</h1>
    <form method="POST" action="/add_student/">
        <p>学生姓名<input type="text" name="name"/></p>
        <p>所属班级
            <select >
                    <option>Django1班</option>
            </select>
        </p>

        <input type="submit" value="提交" />
    </form>
</body>
</html>

展示如下所示:

那这个班级信息自然去数据库查询获得,这里这里的思路就是,在view.py中add_student中,先查询出来班级信息,然后在add_student.html中使用一个for循环展示出班级信息,这个在前面的已经反复使用了

所以这里输入姓名和选择后班级后,进行提交,这里提交会涉及到是包含班级信息提交什么东西到后台去,是id还是内容?因为提交的是学生信息,学生表中存在的是学生id,姓名和班级id信息,所以如果是提交班级内容,还需要到后台再次去查询班级信息获取id

修改add_student.html文件如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>添加学生</h1>
    <form method="POST" action="/add_student/">
        <p>学生姓名<input type="text" name="name"/></p>
        <p>所属班级
            <select name="class_id">
                {% for row in class_list %}
                    <option value="{{ row.id }}">{{ row.title }}</option>
                {% endfor %}
            </select>
        </p>

        <input type="submit" value="提交" />
    </form>
</body>
</html>

修改add_student函数中的逻辑

def add_student(request):
    if request.method == 'GET':

        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                               db='studentmanagement',charset='utf8')
        # 创建游标
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

        # 执行SQL,并返回收影响行数
        cursor.execute("select id,title from class")
        class_list =cursor.fetchall()
        print(class_list)

        # 关闭游标
        cursor.close()
        # 关闭连接
        conn.close()
        return render(request,'add_student.html',{'class_list':class_list})
    else:
        name = request.POST.get('name')
        class_id = request.POST.get('class_id')
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                               db='studentmanagement',charset='utf8')
        # 创建游标
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

        # 执行SQL,并返回收影响行数
        cursor.execute("insert into student(name,class_id) values(%s,%s)",[name,class_id,])
        conn.commit()

        # 关闭游标
        cursor.close()
        # 关闭连接
        conn.close()
        return  redirect('/students/')

那学生删除和add类似,和第一篇文中的逻辑处理类似

4.编辑功能

4.1路由分发

url(r'^edit_student/',views.edit_student),

4.2.视图函数

同时在views.py文中新增edit_student处理逻辑

def add_student(request):
    return render(request,"edit_student.html")

如果界面点击使用该逻辑处理之后,界面展示应该是和新增类似

界面上有学生姓名和所属班级信息,编辑之后可以提交,那要编辑班级信息,此时必然要在edit_student中查询班级信息并放置在下来列表中,供编辑选择。结合一和本文发现不断的时候那几个关于sql的功能,此时就要想到将该公共处理部分提取出来

4.3.公共函数

新增一个utils模块,如下所示

import pymysql

def get_list(sql,args):
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                           db='studentmanagement', charset='utf8')
    # 创建游标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 执行SQL,并返回收影响行数
    cursor.execute(sql,args)
    result = cursor.fetchall()

    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

    return result
def get_one(sql,args):
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                           db='studentmanagement', charset='utf8')
    # 创建游标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 执行SQL,并返回收影响行数
    cursor.execute(sql,args)
    result = cursor.fetchone()

    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

    return result

def modify(sql,args):
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                           db='studentmanagement', charset='utf8')
    # 创建游标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 执行SQL,并返回收影响行数
    cursor.execute(sql,args)
    conn.commit()
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

4.4.模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>编辑学生</h1>
    <form>
        <p>学生姓名<input type="text" name="name"/></p>
        <p>所属班级
            <select name="class_id">
                {% for row in class_list %}
                    <option value="{{ row.id }}">{{ row.title }}</option>
                {% endfor %}
            </select>
        </p>

        <input type="submit" value="提交" />
    </form>
</body>
</html>

4.5.视图函数优化1

刚才只是写了视图函数,并没有实现具体的逻辑功能

def edit_student(request):
    nid = request.GET.get('nid')
    print(nid)
    class_list = sqlhelper.get_list('select id,title from class',[])
    curent_student_info = sqlhelper.get_one('select id,name,class_id from student where id=%s',nid)

    return render(request,'edit_student.html',
                  {'class_list':class_list,"curent_student_info":curent_student_info})

但是这里编辑的时候返现,所欲班级的地方展示并不是默认班级信息。所以这类需要查询到每个学生默认的班级,这里会使用到html-option-selected属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>编辑学生</h1>
    <form>
        <p>学生姓名<input type="text" name="name" value="{{ curent_student_info.name }}"/></p>
        <p>所属班级
            <select name="class_id">
                {% for row in class_list %}
                    {% if row.id == curent_student_info.class_id %}
                        <option selected value="{{ row.id }}">{{ row.title }}</option>
                    {% else %}
                        <option  value="{{ row.id }}">{{ row.title }}</option>
                    {% endif %}
                {% endfor %}
            </select>
        </p>

        <input type="submit" value="提交" />
    </form>
</body>
</html>

4.6.视图函数优化2

有了上面的展示默认选择,现在需要实现的是提交功能

    <h1>编辑学生</h1>
    <form method="=POST" action="/edit_student/?nid={{ curent_student_info.id }} ">

所以这里的姓名和班级信息是在psot数据的body中,学生id是在url中的?后面的数据,所以归结如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>编辑学生</h1>
    <form method="POST" action="/edit_student/?nid={{ curent_student_info.id }}">
        <p>学生姓名<input type="text" name="name" value="{{ curent_student_info.name }}"/></p>
        <p>所属班级
            <select name="class_id">
                {% for row in class_list %}
                    {% if row.id == curent_student_info.class_id %}
                        <option selected value="{{ row.id }}">{{ row.title }}</option>
                    {% else %}
                        <option  value="{{ row.id }}">{{ row.title }}</option>
                    {% endif %}
                {% endfor %}
            </select>
        </p>

        <input type="submit" value="提交" />
    </form>
</body>
</html>
from utils import sqlhelper
def edit_student(request):
    if request.method == 'GET':
        nid = request.GET.get('nid')
        class_list = sqlhelper.get_list('select id,title from class',[])
        curent_student_info = sqlhelper.get_one('select id,name,class_id from student where id=%s',[nid,])
        return render(request,'edit_student.html',
                      {'class_list':class_list,"curent_student_info":curent_student_info})
    else:
        nid = request.GET.get('nid')
        name  = request.POST.get('name')
        class_id = request.POST.get('class_id')
        print(nid,name,class_id)
        sqlhelper.modify('update student set name=%s,class_id=%s WHERE id=%s',[name,class_id,nid,])
        return redirect('/students/')

 

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值