Django框架之第二篇--app註冊、靜態文件配置、form表單提交、pycharm鏈接數據庫、django使用mysql數據庫、表字段的增刪改查、表數據的增刪改查

本節知識點大體爲:靜態文件配置、form表單提交數據後端如何獲取、request方法、pycharm鏈接數據庫,django使用mysql數據庫、表字段的增刪改查、表數據的增刪改查css

1、建立app,建立以後必定要先去settings.py註冊html

 

 2、靜態文件配置前端

html文件默認所有放在templates文件夾下python

一、對於前段已經寫好了的文件 咱們只是拿過來使用 那麼這些文件均可以稱之爲叫"靜態文件"。mysql

靜態文件能夠是:sql

  1.bootstrap一類的前端框架,已經寫好了的 2.圖片 3.css,js數據庫

靜態文件默認全都放在static文件夾下django

  static文件夾中默認會默認建立的子文件夾
  css文件夾 當前網站全部的樣式文件
  js文件 當前網站全部的js文件
  img文件 當前網站全部的圖片文件
  其餘(前端框架代碼 第三方插件代碼...)bootstrap

用戶能夠訪問的資源都在url中,只有url中開設相關的資源你才能訪問到(******)後端

 

二、在settings.py文件中

STATIC_URL = '/static/'       這個static不是文件夾的名字 而是接口前綴
只要你想訪問靜態文件中的資源 文件路徑就必須用static開頭(在html頁面中head標籤中導入css,js樣式路徑都要以static開頭,static後面的文件路徑去下面的文件路徑中查找)
手動將static文件夾中全部的資源暴露給用戶
STATICFILES_DIRS = [
  os.path.join(BASE_DIR,'static'), # 真正的文件夾路徑
  os.path.join(BASE_DIR,'static1'), # 真正的文件夾路徑
  os.path.join(BASE_DIR,'static2'), # 真正的文件夾路徑
  os.path.join(BASE_DIR,'static3') # 真正的文件夾路徑
]

三、靜態文件接口前綴"動態解析" (html頁面css,js導入) 防止須要重複更改導入靜態文件路徑 

{% 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>

利用解析器 動態獲取接口前綴

3、form表單提交數據

一、表單提交方式

form表單默認是get請求,攜帶數據的方式是url問好後跟數據,這種方式數據不安全。

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

能夠經過method改成post請求,改成post請求後,須要去settings文件中註釋掉一箇中間件

form表單提交數據目的地action:(三種提交地址方式)
1.不寫的狀況下 默認往當前地址提交
2.還能夠寫後綴/index/(講項目經常使用這種)
3.還能夠寫全路徑

二、視圖函數針對不一樣的請求方式,有不一樣的處理邏輯

request.method能夠獲得表單請求的兩種方式

1.視圖函數通常主要會先處理get請求,把頁面渲染出來,get獲取的數據也是一個大字典 (get請求方式也能獲取到前端提交的數據)

2.post請求就是頁面表單提交的數據,能夠把它當成一個大字典

 request.POST數據格式

三、獲取表單傳遞的具體數據

好比傳遞的username和password值,有兩種方式

第一種方式:
username = request.POST.get('username')  #默認只取列表最後一個元素,因此取出來的數據是字符串(用兩個name同樣input舉例)
第二種方式:
password = request.POST['password']   #不建議這種方式取值,取不到值就會報錯

GET

request.GET獲取前端get提交的數據(就相似因而一個大字典)
            取值
                request.GET.get('username')  # 雖然value是一個列表 可是默認只取列表最後一個元素,強烈不建議你使用中括號的形式取值
                
                # 若是想直接把列表所有取出(******)  好比獲取表單的愛好信息,獲取多個
                request.GET.getlist('hobby')

POST

request.POST獲取前端post提交的數據(就相似因而一個大字典)
            取值
                request.POST.get('username')  # 雖然value是一個列表 可是默認只取列表最後一個元素
                # 強烈不建議你使用中括號的形式取值
                
                # 若是想直接把列表所有取出(******)
                request.POST.getlist('hobby')

4、pycharm鏈接數據庫

 5、django使用mysql數據庫

1.django默認使用的是自帶的sqlite數據庫,若是你想讓它其餘的數據庫 須要在settings配置文件中配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day51',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'root',
    }
}

2.還要在項目名下的init文件或者是應用名下的init文件中告訴django不要使用默認的mysqldb鏈接mysql,而是使用pymysql

import pymysql
pymysql.install_as_MySQLdb()

前面這些操做鏈接上數據庫,下面咱們用django orm對錶進行操做

ORM對象關係映射

表                    類
一條條記錄             對象
字段對應的值           對象的屬性

3.首先須要在應用下的models.py中書寫模型類(建立數據庫)

建立User類

class User(models.Model):
            # 將id字段設置爲User表主鍵字段  在django orm中 你能夠不寫主鍵字典  django會默認給你的表建立一個名爲id的主鍵字段
            id = models.AutoField(primary_key=True)  # 一旦你本身指定了主鍵字段 那麼django就不會自動再幫你建立了
            username = models.CharField(max_length=32)  # username varchar(32)   CharField必需要指定max_length參數
            password = models.IntegerField()  # password int

注意:你在models.py寫了這個類,在數據庫中尚未生成表,還須要在Terminal執行下面這兩句命令。

python3 manage.py makemigrations  # 僅僅是在小本本上(migrations文件夾)記錄數據庫的修改 並不會直接操做數據
python3 manage.py migrate  # 將數據庫修改記錄 真正同步到數據庫

只要是動了models中跟數據庫相關的代碼,就必需要從新執行上面的兩條命令,缺一不可(******)

還有一種簡單的方法執行那兩條命令:

點擊Tools >>Run manage.py Task>>

執行這兩句代碼

 

 應用名+類名就是建立的數據庫名字

 

 6、表字段的增刪改查   (修改了以後都要執行上面的兩句命令)

當一張表已經建立出來以後 後續還想添加字段,能夠有兩種方式
    1.給新增的字段設置默認值
        addr = models.CharField(max_length=32,default='China')  # default該字段默認值

    2.給新增的字段設置成能夠爲空
        age = models.IntegerField(null=True)  # 該字段容許爲空

就是改字段的結構,字節大小,修改完以後也要記得運行那兩句命令行

刪(慎用)

刪除字段 直接在models.py中註釋該字段 而後從新執行兩條命令便可
注意:執行完以後 表中該字段所對應的全部的數據所有刪除,而且通常狀況下 基本是不會用到真正意義上的刪除

7、表數據的增刪改查

1.數據的查(有兩種查get/filter)

第一種:

models.User.objects.get(username=username)    若是username不存在的時候會報錯

第二種:(建議用第二種)

res = models.User.objects.filter(username=username)

user_obj = res.first()      經過first()獲取第一個對象,不推薦使用索引取值,緣由在於一旦沒有數據,再索引取值會報錯(支持正數索引,不支持負數索引),還支持切片操做(也是正數切片)。雖然first內部也是按照索引取值,但沒有數據,不會報錯,是返回None

filter查詢出來的結果(Queryset)是一個列表 "列表內放的是一個個數據對象";當查詢條件不存在的時候,不會報錯,只會返回一個空列表;filter括號內支持寫多個參數,而且參數與參數之間是and的關係。

res.query    只有querySet對象才能經過點query查看sql語句

第三種:查全部

models.User.objects.all()       #拿到的也是queryset對象

models.User.objects.get(username=username) 

res = models.User.objects.filter(username=username)
user_obj = res.first()  #拿到列表中第一個數據對象
user_obj.username   #獲取查詢到的user_obj的username值

models.User.objects.all()
#查詢全部數據

2.數據的增(兩種方式)

1.create()
models.User.objects.create(username=username,password=password) #返回值就是新增的數據對象自己  insert into user(username,password) values(username,password)
2. 利用對象
user_obj = models.User(username=username,password=password)
user_obj.save()

3.數據的刪

models.User.objects.filter(條件).delete()

真實案例:點擊刪除按鈕刪除本行

前端頁面刪除按鈕綁定: href='/del_user/?id={{user.id}}'

views.py:  經過get請求request.GET.get('id')獲取綁定的user_id值,而後經過user_id查詢models.User.objects.filter(id=user_id).delete刪除選中的用戶

4.數據的改

方式一:

models.User.objects.filter(條件).update(username=username,password=password)

filter拿到是一個列表,filter操做其實都是批量操做。若是filter結果列表中有多個數據,那麼會一次性所有修改,相似於for循環一個個修改。 

方式二:對象的方式(不推薦使用),這種方式會從頭至尾將全部的字段所有修改一遍,效率極低

obj.username=username

obj.password=password

obj.save()

相關文章
相關標籤/搜索