Day42 of learning python --Django的增删改查操作

1.学员管理之数据库表结构设计

学生管理:
    表:
        班级
        学生
        老师 
    单表操作:
        -增 
        -删 
        -改 
        -查 
    一对多操作:
        -增 
        -删 
        -改 
        -查 
    多对多操作:
        -增 
        -删 
        -改 
        -查 
步骤:
1.在navicat上创建好数据库和数据表
2.在pycharm创建django项目,修改相关的配置
3.操作班级表的添加,删除和修改

遇到的小问题:
1.a标签的herf属性,form的action属性,需要与url的路由系统的网址一致才行,最后要加'/'
2.table的tbody中是先tr,在到td
3.记住http是短连接,如果有修改数据的时候必须要保存原来能够找到的元素属性
4.GET和POST是以字典的形式存储的

2.具体代码操作

文件:

url.py:

from django.contrib import admin
from django.urls import path
from app01 import views                 #设置专门的views.py文件用来存放url的响应函数,方便管理
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('classes/', views.classes),     #查看班级,第一个完成的功能
    path('add_class/', views.add_class), #添加班级
    path('del_class/', views.del_class),  #删除班级
    path('edit_class/', views.edit_class), #编辑班级
]

 views.py:

from django.shortcuts import render,redirect
import pymysql
def classes(request):                                            
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='baicells', db='djangopratice',charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)          #以字典的形式连接
    cursor.execute("select id,tittle from class")
    class_list = cursor.fetchall()  # 得到的是一个带有字典的列表
    cursor.close()
    conn.close()
    return render(request,'classes.html',{'class_list':class_list})      # 从数据库拿到的数据用来渲染html文件

def add_class(request):
    if request.method == "GET":                                     #如果在classes.html页面上点添加的按钮,则跳到add_class.html的页面上
        return render(request,'add_class.html')
    else:               #add_class.html点击提交按钮,才到这一步,提交数据
        print(request.POST)
        v = request.POST.get('tittle')                            #此处得到的是input框输入的数据,以name='tittle'的属性来识别的
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='baicells', db='djangopratice',charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute("insert into class(tittle) values(%s)",[v,])
        conn.commit()
        cursor.close()
        conn.close()
        return redirect('/classes/')                      #再一次访问服务器,重新刷新获取数据

def del_class(request):                              #在classes.html上点击删除时,有a标签跳转URL,并发送过来URL的要删除的nid
    nid = request.GET.get('nid')
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='baicells', db='djangopratice',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/')    # 跳转到这个页面,重新刷新

def edit_class(request):                           
    if request.method == 'GET':    # a标签的get请求,点击的编辑链接
        nid = request.GET.get('nid')    # 在classes.html上点击编辑时,有a标签跳转url,并发送过来的URL要编辑的nid,这样就知道了要编辑那个东西了
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='baicells', db='djangopratice',
                               charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute("select id,tittle from class where id =%s",[nid,])
        classone = cursor.fetchone()             #获取数据用fetchone()得到一行的数据
        cursor.close()
        conn.close()
        return render(request,'edit_class.html',{'classone':classone})   # 得到的数据,将edit_class.html进行渲染,因为要有保留的数据显示才能让客户知道是在编辑什么的
    else:
        # nid = request.POST.get('nid')     #点击提交edit_class.html的提交按钮
        nid = request.GET.get('nid')  #  由于http是短连接,所以需要从编辑的页面再次获得数据才能知道需要更改的地方,通过网址获取,form的action提交到那个网页的
        tittle = request.POST.get('tittle')
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='baicells', db='djangopratice',
                               charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute("update class set tittle=%s where id=%s",[tittle,nid])
        conn.commit()
        cursor.close()
        conn.close()
        return redirect('/classes/')

 classes.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</head>
<body>
<h3>班级信息</h3>
<div>
    <a href="/add_class/">添加</a>
</div>
    <table border="1">
        <thead>
        <tr>
            <th>id</th>
            <th>tittle</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
            {% for row in class_list %}               循环取数据,class_list是{'class_list':class_list}的key
                <tr>
                    <td>{{ row.id }}</td>
                    <td>{{ row.tittle }}</td>
                    <td>
                        <a href="/edit_class/?nid={{ row.id }}">编辑</a>
                        |
                        <a href="/del_class/?nid={{ row.id }}">删除</a>                 
                    </td>
                </tr>
            {% endfor %}
        </tbody>
    </table>

</body>
</html>

add_class.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>add_class</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</head>
<body>
<h3>添加班级</h3>
<form action="/add_class/" method="POST" >
    <p>班级:<input type="text" name="tittle"></p>
    <input type="submit" value="提交">
</form>

</body>
</html>

edit_class.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>add_class</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</head>
<body>
<h3>编辑班级</h3>
<form action="/edit_class/?nid={{classone.id}}" method="POST" >
    <!--<p><input style="display: none" type="text" value={{ classone.id }} name="nid"></p>  一种方式利用form提交的方式,隐藏起来-->
    <p>班级:<input type="text" name="tittle" value={{ classone.tittle }}></p>
    <input type="submit" value="提交">
</form>

</body>
</html>
posted on 2019-01-24 20:05  smile大豆芽  阅读(114)  评论(0)    收藏  举报