Django request對象與ORM簡介

form表單

form表單默認是以get請求提交數據的css

http://127.0.0.1:8000/login/?username=admin&password=123html

action前端

1.不寫 默認朝當前地址提交數據python

2.全路徑mysql

3.後綴(/index)jquery

提交post請求的時候 須要先去配置文件中註釋掉一行sql

視圖函數應該作到針對不一樣的請求 作出不一樣的處理邏輯數據庫

- get請求來 應該只須要返回一個html文件django

- post請求來 應該獲取用戶提交的數據 而後作進一步處理bootstrap

你必需要可以判斷出當前請求究竟是什麼請求

 

request對象

獲取前端請求方式

request.method  # 結果是一個純大寫的字符串  GET/POST

一般狀況下針對不一樣的請求應該作不一樣的處理

def login(request):
    # if request.method =='GET':
    #     #GET邏輯
    #     return render(request, 'login.html')
    # elif request.method =='POST':
    #     #POST邏輯
    #     print(request.method, type(request.method))  # GET <class 'str'>  POST <class 'str'>
    #     return HttpResponse('收到了你的數據,立刻處理')      
    # print(request.method)  #獲取前端請求方式
    """爲了減小代碼的層級:通常狀況下視圖函數處理get請求較多,因此能夠直接在函數體內先寫GET請求對應的邏輯
    將其餘請求利用request.method作出區分
    """
    if request.method == 'POST':
        return HttpResponse('收到了')
    return render(request, 'login.html')


獲取POST請求提交的數據:

request.POST #相似因而一個大字典
             # <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
        request.POST.get()  # 只會取列表最後一個元素
        request.POST.getlist()  # 取出整個列表

以下所示,是一個簡易的登陸頁面 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2 class="text-center">登陸</h2>
            <form action="" method="post">
                <p>username:<input type="text" name="username" class="form-control"></p>
{#                <p>username:<input type="text" name="username" class="form-control"></p>#}
                <p>password:<input type="text" name="password" class="form-control"></p>
{#                <p>hobby:#}
{#                    bbb<input type="checkbox" name="hobby" value="bbb">#}
{#                    aaa<input type="checkbox" name="hobby" value="aaa">#}
{#                    ccc<input type="checkbox" name="hobby" value="ccc">#}
{#                </p>#}
                <input type="submit" class="btn btn-success ">
            </form>
        </div>
    </div>
</div>
</body>
</html>
View Code

針對login.html頁面進行相應地取值和處理的邏輯操做

def login(request):
    if request.method == 'POST':
        #如何獲取數據(GET和POST)
        print(request.POST) #獲取post請求攜帶的數據
        #獲取用戶的用戶名與密碼
        # <QueryDict: {'username': ['hank'], 'password': ['123']}>
        username = request.POST.get('username')  # 用get取值只會取列表最後一個元素
        password = request.POST.get('password')
        print(username,type(username))  #hank <class 'str'>
        print(password,type(password))  #123 <class 'str'>
        #若是你想直接拿到列表
        hobby = request.POST.getlist('hobby') # getlist取到的是一個列表
        print(hobby,type(hobby)) #['bbb', 'aaa', 'ccc'] <class 'list'>

        return HttpResponse('收到了')
    return render(request, 'login.html')

獲取符合GET請求攜帶數據格式的數據:

注意:GET請求獲取的數據格式和POST同樣

request.GET  # 獲取符合get請求攜帶數據格式的數據 url?xxx=yyy&ooo=lll
                   # <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
        request.GET.get()  # 只會取列表最後一個元素
        request.GET.getlist()  # 取出整個列表        

針對login.html頁面進行相應地取值和處理的邏輯操做

def login(request):
    if request.method == 'POST':
        #如何獲取數據(GET和POST)
        print(request.POST) #獲取post請求攜帶的數據
        #獲取用戶的用戶名與密碼
        # <QueryDict: {'username': ['hank'], 'password': ['123']}>
        username = request.POST.get('username')  # 用get取值只會取列表最後一個元素
        password = request.POST.get('password')
        print(username,type(username))  #hank <class 'str'>
        print(password,type(password))  #123 <class 'str'>
        #若是你想直接拿到列表
        hobby = request.POST.getlist('hobby') # getlist取到的是一個列表
        print(hobby,type(hobby)) #['bbb', 'aaa', 'ccc'] <class 'list'>

        return HttpResponse('收到了')
print(request.GET) print(request.GET.get('username'),type(request.GET.get('username'))) print(request.GET.getlist('password'),type(request.GET.getlist('password'))) return render(request,'login.html')

Django鏈接數據庫

前提:Django鏈接數據庫,須要你本身提早建立好對應的庫

1.先去配置文件中配置相關參數

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #數據庫的類別
        'NAME': 'db1',  #庫的名字
        'HOST':'127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123',
        'CHARSET': 'utf8'
    }
}
# 對於python3的使用者們還須要再加一步操做 # 因爲Django內部鏈接MySQL時使用的是MySQLdb模塊,而python3中還無此模塊,因此須要使用pymysql來代替 # 以下設置放置的與項目同名或者應用下的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb()

Django ORM簡介

django orm不會幫你建立庫  只能幫你自動建立表

orm對象關係映射:

類  ------->  表

對象 -------> 記錄

屬性  ------->  字段值

首先須要先去對應的應用下的models.py中書寫你的模型類(表)

class User(models.Model):
    # id int primary key auto_increment
   #當你沒有指定主鍵的時候,django orm會自動幫你建立一個名爲id的主鍵字段
   #一旦檢測到你本身建立了主鍵字段,那麼就不會再幫你chuang
id = models.AutoField(primary_key=True) # name varchar(32) name = models.CharField(max_length=32) # password int password = models.IntegerField()

數據庫遷移(同步)命令

python3 manage.py makemigrations  # 僅僅是將你對數據庫的改動記錄到某個小本本上(migrations文件夾)

python3 manage.py migrate  # 將改動真正的同步到數據庫中

"""
上面兩個命令必須是成對出現的
"""

只要你動了models.py跟數據庫相關的代碼 你就必需要從新執行上面的兩條命令來保證數據庫與models.py一致

字段的增刪改查

字段的增

  1.要麼給該字段設置默認值
  2.要麼運行該字段能夠爲空

字段的改

直接修改表中字段的代碼 以後執行數據庫遷移命令便可

字段的刪

只要註釋掉對應的字段 執行數據庫遷移命令就會將對應的字段及數據信息所有刪除(慎用)

 數據的增刪改查

查詢數據

一、filter()

from app01 import models
res
= models.User.objects.filter(username='hank') # select * from user where username='jason' # 返回的res是一個列表 user_obj = res.first() # filter方法條件不存在的時候 不會報錯返回的是一個空列表

""" filter括號內直接放多個關鍵字參數 而且多個關鍵字參數之間是and關係 """ # select * from user where username='jason' and password='123'; res = models.User.objects.filter(username='jason',password='123')

見以下詳情:

from app01 import models

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')  # 用get取值只會取列表最後一個元素
        password = request.POST.get('password')

        #查詢數據庫
        #下面返回的結果能夠看做是一個列表,
        res = models.User.objects.filter(name=username)
        # print(res) # <QuerySet [<User: User object>]>
        #user_obj = res[0]  # QuerySet支持索引取值可是不支持負數,不推薦使用
        user_obj = res.first()
        print(user_obj.name,user_obj.password)
        return HttpResponse('收到了')
    return render(request,'login.html')

二、查全部的數據

filter() 括號內寫任何參數就是 查詢全部數據

all()  查詢全部數據

user_queryset = models.User.objects.filter()
'''
or
'''
user_queryset = models.User.objects.all()

增長數據

準備:先寫好一個註冊的html頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2 class="text-center">註冊</h2>
            <form action="" method="post">
                <p>username:<input type="text" name="username" class="form-control"></p>
{#                <p>username:<input type="text" name="username" class="form-control"></p>#}
                <p>password:<input type="text" name="password" class="form-control"></p>
{#                <p>hobby:#}
{#                    bbb<input type="checkbox" name="hobby" value="bbb">#}
{#                    aaa<input type="checkbox" name="hobby" value="aaa">#}
{#                    ccc<input type="checkbox" name="hobby" value="ccc">#}
{#                </p>#}
                <input type="submit" class="btn btn-primary ">
            </form>
        </div>
    </div>
</div>
</body>
</html>
register.html

方法一、create()

def reg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        #直接朝數據庫中添加數據
        user_obj = models.User.objects.create(name=username,password=password)
        print(user_obj,user_obj.name)
    return render(request,'register.html')

方法二、對象的綁定方法

#1 先生成一個User對象
user_obj = models.User(name=username, password=password)
#2 調用對象的綁定方法
user_obj.save()

 

刪除數據

準備一個用戶展現頁home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
{#    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{#    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>#}
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h1 class="text-center">數據展現</h1>
            <table class="table table-striped table-hover">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>name</th>
                        <th>password</th>
                        <th>operation</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user_obj in res %}  <!--[user_obj1,user_obj2...]-->
                        <tr>
                            <td>{{ user_obj.id }}</td>
                            <td>{{ user_obj.name }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td>
                                <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-xs">編輯</a>
                                <a href="/delete_user/?delete_id={{ user_obj.id }}" class="btn btn-danger btn-xs">刪除</a>
                            </td>
                        </tr>
                    {% endfor %}

                </tbody>
            </table>

        </div>
    </div>
</div>
</body>
</html>
home.html
models.User.objects.filter(id=1).delete()  # 將filter過濾出來的數據所有刪除   批量刪除

見以下詳情:

def del_user(request):
    # 獲取用戶想要刪除的數據id
    delete_id = request.GET.get('delete_id')
    # 直接根據id刪除數據
    models.User.objects.filter(id=delete_id).delete() #將filter過濾出來的數據所有刪除
    #重定向到展現頁
    return redirect('/home')

修改數據

# 方式一(推薦)       批量更新
models.User.objects.filter(id=1).update(name=username,password=password)
# 方式二(瞭解) # 1.先獲取數據對象 edit_obj =models.User.objects.filter(id=1).first() # 2.再修改對象屬性 edit_obj.name = username edit_obj.password = password # 3.調用對象的綁定方法保存 edit_obj.save()

見以下詳情:

def edit_user(request):
    #獲取用戶想要修改的數據id值
    edit_id = request.GET.get('edit_id')
    if request.method == 'POST':
        #獲取用戶修改以後的用戶名和密碼
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 修改數據
        # 方式一
        models.User.objects.filter(id=edit_id).update(name=username,password=password)
        # 方式二
        # 1.先獲取數據對象
        edit_obj =models.User.objects.filter(id=edit_id).first()
        # 2.再修改對象屬性
        edit_obj.name = username
        edit_obj.password = password
        # 3.調用對象的綁定方法保存
        edit_obj.save()
        #再次跳轉到數據展現頁
        return redirect('/home')
    #根據id獲取數據對象,而且展現到html頁面上
    edit_obj = models.User.objects.filter(id=edit_id).first()
    return render(request,'edit_user.html',{'edit_obj':edit_obj})

 

相關文章
相關標籤/搜索