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

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

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

 

 基于这个关系,建立了以下数据库:mysql

 

1.展现数据: 

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

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

这样之后就能够在 urls.py写:django

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开发【第一篇】app

那上面就实现了链接数据库取得数据的操做,那如何展示出来呢?就是建立一个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展现页,包含了特殊标记。展现表单以循环实现。fetch

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

 

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

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中取。

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

 

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

相关文章
相关标签/搜索