Django與數據庫

執行邏輯的都可以叫做視圖函數(包含函數或者類)

路由訪問時不加最後不加斜槓/,本質是瀏覽器內部重定向爲用戶跳轉到加了斜槓的網頁(看響應狀態碼是3開頭)。

name屬性用來標識數據

引用外部資源沒有效果解決方法

我們發現導入的Bootstrap沒有效果,發現也找不到此路徑下的文件。

方法一:在urls中添加路徑

方法二:配置靜態文件

我麼知道所有的html文件默認都寫在templates文件夾下,其實所有的靜態文件(css,js,img,前端第三方類庫)默認都放在static文件夾下。

到settings.py文件最後找到STATIC_URL = '/static/'加入以下代碼

STATIC_URL = '/static/'  # 接口前綴,與靜態文件存放目錄沒有任何關係,但默認這個前綴與靜態文件存放目錄一致
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')  # static是你的靜態文件存放目錄,可以配置多個目錄,因爲不同應用目錄裏面也可以有靜態文件目錄,會依次查找列表中所有的靜態文件目錄,找到的話立刻停止,都沒有找到返回404
    os.path.join(BASE_DIR,'static-x')
]
# HTML文件導入文件時,最前面的反斜槓不能少
 <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
 <script src="/static/bootstrap/js/bootstrap.min.js"></script>

form表單觸發提交數據的動作兩種方式

<input type="submit">

<button></button>

form提交數據的地址如何指定及方式?

action屬性控制提交的地址

方式:

<!--1.全路徑-->
<form action="http://127.0.0.1:8000/login/">
<!--2.只寫路徑後綴-->
<form action="/login/">
<!--3.不寫 (默認往當前路徑提交)-->

form表單默認是get請求

注意:去settings.py裏面的MIDDLEWARE將csrf那行代碼註釋掉

根據客戶端請求方式的不同執行不同的邏輯代碼

request.method獲得請求方式

def login(request):
    # 獲取用戶端提交的請求方式
    print(request.method)  # 拿到的請求方式是全大寫的字符串
    if request.method == 'GET':  # 若請求是get
        return render(request,'login.html')
    elif request.method == 'POST':  # 若請求是post
        return HttpResponse("收到了")
# 簡化版本
def login(request):
    if request.method == 'POST':
        return HttpResponse('OK')
    return render(request,'login.html')

獲取客戶端請求的數據

request.POST:< QueryDict: {'key1': ['value2'], 'key2': ['value2']} >可看成一個大字典裏面存放着客戶端post提交的所有數據

request.POST.get('key')value雖是列表但獲取value時得到是單個元素,默認只會取value列表裏面的最後一個元素

request.POST.getlist('key')獲取value列表中所有的數據,用戶的愛好,多選框等

不推薦request.POST.['key']獲取數據,若key不存在會報錯

同理,若請求爲get,則將POST改成GET

Django與數據庫

用pymsql連接數據庫

import pymysql

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')  # 此username是依據前端form表單中的name屬性值
        password = request.POST.get('password')
        conn = pymysql.connect(
            host = '127.0.0.1',
            port = 3306,
            user = 'root',
            password ='weiruo95',
            database = 'day54',
            charset ='utf8',
            autocommit = True,
        )
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        cursor.execute('select * from userinfo where name=%s and password = %s',(username,password))  # 放一個元祖,會自動拼接
        user_info = cursor.fetchall()
        if user_info:
            return HttpResponse('登錄成功!')
    return render(request,'login.html')

用pycharm連接數據庫

在這裏插入圖片描述

點擊加號下拉菜單

在這裏插入圖片描述

在這裏插入圖片描述

下載驅動完成後填寫相關信息

在這裏插入圖片描述

出現java.lang.RuntimeException錯誤,是因爲JDBC驅動程序的5.2版本與UTC時區配合使用,必須在連接字符串中明確指定serverTimezone

解決方法:

去數據庫設置時區 set global time_zone = ‘+8:00’;

找不到數據庫解決方法:點擊 0 of 7處

在這裏插入圖片描述

操作數據庫

在這裏插入圖片描述

Django連接MySQL

settings.py文件下的DATABASES處修改配置

在這裏插入圖片描述

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 連接數據庫種類
		'NAME': 'test',  # 連接數據庫名
        'HOST':'127.0.0.1',  # IP
        'PORT':3306,  # 端口
        'USER':'root',  # 用戶名
        'PASSWORD':'123456'  # 密碼
    }
}
# 鍵必須都是大寫

告訴Django用pymysql替換它默認mysqldb模塊連接數據庫

方式1:在你的項目文件夾下面的__init__.py
方式2:也可以在你的應用文件夾下面的__init__.py

# 固定寫法
import pymysql
pymysql.install_as_MySQLdb()  # 告訴django用pymysql代替mysqldb連接數據庫

重新連接其他數據庫

右鍵原數據庫,remove,連接流程如上介紹

利用ORM生成類對應一張表

1.應用文件夾下的models.py文件中定義類

class User(models.Model):
    # user表的主鍵字段名設爲id且自增
    id = models.AutoField(primary_key=True)
    # varchar(32)name字段是varchar(32) CharField在定義的時候必須加上max_length參數
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=16)

2.數據庫遷移(同步)命令

python3 manage.py makemigrations將你的數據庫變動記錄到文件中,並不會幫你創建一張表

在這裏插入圖片描述

python3 manage.py migrate將你的數據庫變動正在同步到數據庫中

新增數據

# 簡易網頁註冊保存信息至數據庫
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)  # 返回一個User類實例化的對象即數據庫內的一行
        # 方式二:
        user_obj = models.User(name=username,password=password)
        user_obj.save()
        
        print(user_obj)
        print(user_obj.pk)  # pk對應主鍵名,此處換爲id是一樣的
        print(user_obj.name)
        print(user_obj.password)
        return HttpResponse('註冊成功!')
    return render(request,'reg.html')
<div class="container">
    <div class="row">
        <h1>註冊頁面</h1>
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post">
                <p>username:<input type="text" name="username" class="form-control"></p>
                <p>password:<input type="password" name="password" class="form-control"></p>
                <input type="submit" class="btn btn-primary">
            </form>
        </div>
    </div>
</div>

查看數據

def userlist(request):
    # 獲取數據庫數據
    user_list = models.User.objects.all()
    # print(user_list)  # <QuerySet [<User: User object>, <User: User object>, <User: User object>, <User: User object>]> 更改__str__方法後<QuerySet [<User: moon>, <User: hysen>, <User: pinking>, <User: muzier>]>
    #     # print(user_list.query)  # 只要是QuerySet對象,都能.query獲得當前QuerySet對象內部的sql語句 SELECT `app01_user`.`id`, `app01_user`.`name`, `app01_user`.`password` FROM `app01_user`
    #     # for user_obj in user_list:
    #     #     print(user_obj.id,user_obj.name,user_obj.password)
    return render(request,'userlist.html',locals())
# 重定向  可以寫別人的網址也可以是自己的路徑
<div class="container">
    <div class="row">
    <h1>數據展示</h1>
        <div class="col-md-8 col-md-offset-2">
            <table class="table table-striped table-hover table-bordered">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>name</th>
                        <th>password</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user_obj in user_list %}
                        <tr>
                            <td>{{ user_obj.pk }}</td>
                            <td>{{ user_obj.name }}</td>
                            <td>{{ user_obj.password }}</td>
                        </tr>
                    {% endfor %}
                    
                </tbody>
            </table>
        </div>
    </div>
</div>

user_list是一個QuerySet數據類型,列表套着多個對象:<QuerySet [<User: User object>, <User: User object>, <User: User object>, <User: User object>]>

只要是QuerySet對象,都能.query獲得當前QuerySet對象內部的sql語句

視圖函數必須返回一個HTTPResponse對象 不然會報錯ValueError: The view app01.views.userlist didn't return an HttpResponse object. It returned None instead 其實render和redirect返回的也是HTTPResponse對象

模板語法中{{ }}與變量有關,{{%%}}與邏輯相關

查詢數據需要注意的是你獲取到的到底是一個queryset還是一個數據對象,如果你是要獲取數據對象,first千萬別忘了

user_query = models.User.objects.filter(id=edit_id).first()

filter和get獲取數據的區別

filter當條件不存在的情況下會返回一個空的queryset對象

<QuerySet []> <class 'django.db.models.query.QuerySet'>

用get可以直接獲取到數據對象本身但是查詢條件不存在的情況下直接報錯

user_obj = models.User.objects.get(id=edit_id)

新增數據按鈕

<!--利用a標籤href屬性 可以指定頁面跳轉的路徑  href可以寫全路徑 但是推薦寫後綴即可-->
<a href="/reg/" class="btn btn-default" >新增數據</a>
<!--必須記得href後加的路徑,前面斜槓/必須加,不然只是在當前路徑後面拼接你加的路徑。-->

models裏類的變動

修改模型層裏面的跟表相關的所有的數據,只要你修改了就必須重新執行數據庫遷移命令,同時如果你的數據庫中有記錄,那麼需要爲原有記錄的新增字段添加默認值。

編輯數據

# 編輯對象的id的獲取方式
# 方式1:利用input隱藏一個標籤
<input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
# 方式2:
<form action="/edit/?edit_id={{ user_obj.pk }}" method="post">

# 注意:queryset對象點修改 刪除 會作用於對象內部所有的數據對象  類似於批量操作
# 方式1:
models.User.objects.filter(id=edit_id).update(name=username,password=password)
# 方式2:獲取到當前數據對象
user_obj = models.User.objects.filter(id=edit_id).first()
user_obj.name = username
user_obj.save()

刪除數據

models.User.objects.filter(id=1).delete()  # 會將queryset所有的數據對象全部刪除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章