Django学习小记3-学员管理数据库①

创建一个数据库要先想好各个表的对应关系:一对一、一对多、多对多;

表结构:班级、学生、老师

 

 基于这个关系,创建了如下数据库:

 

1.展示数据: 

先对班级class进行操作试一下:

以前我们写的程序都放在urls.py文件里,显得复杂而不够专业!所以我们可以新建一个目录比如叫 /app01/,再新建一个views.py(路径会自动添加,注意核对好)

这样以后就可以在 urls.py写:

from app01 import views
...
urlpatterns = [
#path('admin/', admin.site.urls),
path('classes',views.classes)
]

那是不是我们就需要在 views.py 里定义一个classes的函数:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from django.shortcuts import render

#展示班级
def classes(request):
    import pymysql
    conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123!@123', db='oldboys',charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #创建游标
    cursor.execute("select id,title from class")    #执行SQL
    class_list = cursor.fetchall()
    cursor.close()     #关闭游标
    conn.close()       #关闭连接
    return render(request,'classes.html',{'class_list':class_list})

真情链接:更多数据库操作请看武sir-Python开发【第十九篇】:Python操作MySQL | python开发【第一篇】

那上面就实现了连接数据库取得数据的操作,那如何展现出来呢?就是创建一个return的那个 class.html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级</title>
</head>
<body>
    <h1>班级列表</h1>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>班级名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in class_list %}
            <tr>
                <td>{{ row.id }}</td>
                <td>{{ row.title }}</td>
           </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

看,最终的实现流程是:Djando 通过urls.py路由对应里找到新目录的views.py导入的函数classes, 这个函数再渲染classes.html展示页,包含了特殊标记。展示表单以循环实现。

最终这样,实现数据库数据及时展现:

 

 这样不算完,我们还有一个添加数据的需求:

2.添加数据:

就是在展示界面,添加一个<a>标签,实现增加一个班级的操作。(页面跳转)

<body>
    <h1>班级列表</h1>
    <div>
        <a href="/add_class/">添加</a>
    </div>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>班级名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in class_list %}
            <tr>
                <td>{{ row.id }}</td>
                <td>{{ row.title }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>

我们在templates下新建一个add_class.html的简单增加界面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加班级</title>
</head>
<body>
    <h1>增加班级</h1>
    <form method="POST" action="/add_class/">
        <p>班级名称:</p>
        <input type="text" name="title" required autofocus /><br>
        <input type="submit" value="提交" />
    </form></body>
</html>

这样再修改路由urls

urlpatterns = [
    #path('admin/', admin.site.urls),
    path('classes/',views.classes),
    path('add_class',views.add_class),

]

然后再在views.py里创建一个add_class的函数:

...

#添加班级
def add_class(request):
    #判断提交方式来区分什么操作
    if request.method == "GET":
        return render(request,'add_class.html')
    else:
        #print(request.POST)
        v = request.POST.get('title')
        #将title值添加到数据库
        import pymysql
        conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='X123!@#123', db='oldboys', charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute("insert into class(title) values(%s)",[v,])
        conn.commit()  #提交
        cursor.close()
        conn.close()
        #提交完再跳转到展示页
        return redirect('/classes/')

3. 删除数据

假设要删除一行数据,是不是需要把ID拿到,请求发过去就是告诉服务端要删除谁。那怎么传递这个id参数呢?

用到/?nid={{row.id}}

所以改的classes,html展示页:

<body>
    <h1>班级列表</h1>
    <div>
        <a href="/add_class/">添加</a>
    </div>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>班级名称</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            {% for row in class_list %}
            <tr>
                <td>{{ row.id }}</td>
                <td>{{ row.title }}</td>
                <td><a href="/del_class/?nid={{ row.id }}">删除</a></td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>

对应我们要在路由urls.py再增加对应:

path('del_class/',views.del_class),

再在views.py增加del_class函数:

...
#删除班级
def del_class(request):
    nid = request.GET.get('nid')
    # 数据库操作
    import pymysql
    conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123!@#123', db='oldboys', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("delete from class where id=%s", [nid, ])
    conn.commit()  # 提交
    cursor.close()
    conn.close()
    # 提交完再跳转到展示页
    return redirect('/classes/')

由此可见http是一次请求一次响应。

4.编辑数据

这个时候我们发现光有删除是不够的,还需要一个编辑,修改class.html文件:

        <tbody>
            {% for row in class_list %}
            <tr>
                <td>{{ row.id }}</td>
                <td>{{ row.title }}</td>
                <td>
                    <a href="/edit_class/?nid={{ row.id }}">编辑</a>
                    |
                    <a href="/del_class/?nid={{ row.id }}">删除</a>
                </td>
            </tr>
            {% endfor %}
        </tbody>

这样有了点击按钮,我们就要设置下路由urls.py

    path('edit_class/',views.edit_class),

再在templates下增加一个edit_class.html

添加默认值放到表格的value中,就相当于添加原始值了;

id和titlle要一起发过去,不然不知道修改谁。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑班级</title>
</head>
<body>
    <h1>编辑班级</h1>
    <!--<form method="POST" action="/edit_class/" >>-->
     <form method="POST" action="/edit_class/?nid={{ result.id }}"
        <p>班级名称:</p>
        <!--<input style="display: none" name="id" value="{{ result.id }}"/><br>>-->
        <input type="text" name="title" value="{{ result.title }}" autofocus /><br>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

 然后对应到views.py写个edit_class的函数:

...
#编辑班级
def edit_class(request):
    if request.method == "GET":
        nid = request.GET.get('nid')
        # 数据库操作
        import pymysql
        conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123@#123', db='oldboys', charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute("select id,title from class where id=%s", [nid, ])
        result = cursor.fetchone()  # 获取原始值
        cursor.close()
        conn.close()
        return render(request, 'edit_class.html', {'result': result})
    else:
        #是POST请求时,提交新的数据到数据库
        #nid = request.POST.get('id')  这个对应隐藏标签操作
        nid = request.GET.get('nid')
        title = request.POST.get('title')
        import pymysql
        conn = pymysql.connect(host='10.0.4.x', port=3306, user='root', passwd='123@#123', db='oldboys', charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute("update class set title=%s where id=%s", [title,nid, ])
        conn.commit()
        cursor.close()
        conn.close()
        return redirect('/classes/')

注:值得注意的是,此时提交编辑的数据是要连带id一起提交的,因为提交操作又是一种新的请求,不然服务器不知道对应的哪个修改。

所以带id提交有两种方式可以实现:

1.POST提交表单时也写入<input>id 只不过利用dispaly=none属性将其隐藏用户看不到了,但实际他就在那然后一起提交给数据库了,这个时对应的操作数据库提取的就都是POST.get

2,也可以不隐藏,因为可以在url中携带nid,所以<form method="POST" action="/edit_class/?nid={{ result.uid }}">,然后提交数据库nid就从GET.get取,title还是POST.get中取。

这样就完成数据库的增删改查操作!

 

原创文章!转载请在明显处注明出处及链接,多谢合作~

posted @ 2020-01-01 22:12  香农Shannon  阅读(219)  评论(0编辑  收藏  举报