一.Django靜态檔案配置
啟動Django項目需知
1.啟動Django項目必須確定一個端口号隻能有一個Django項目,否則很容易出現bug
2.使用者可以通路的資源都在url中,也就是隻有url中開設的相關資源才能通路到(******)
如果通路不存在的資源,會報錯,但前端頁面會提示可以通路的url字尾

3.在浏覽器中展示頁面時,有時修改了但是前端頁面并沒有展示,這時有可能是浏覽器自動通路了已經被緩存的部分,我們需要配置一個自動删除緩存功能
右鍵點選浏覽器的檢查
靜态檔案簡介
在Django項目中,html檔案預設是全部放在templates檔案夾下,對于前段寫好了的檔案,我們隻是拿過來使用,這些檔案就可以稱之為"靜态檔案"
靜态檔案可以是:
bootstrap一類的前段架構
圖檔
css樣式
js代碼
這些靜态檔案預設是全部放在static檔案夾下(這個檔案夾沒有幫我們建,是以需要我們自己手動建立)
static檔案夾中我們預設需要建立的子檔案夾
css檔案夾:存放目前網站所有的樣式檔案
js檔案:目前網站所有的js檔案
img檔案:目前網站所有的圖檔檔案
其他(前段架構代碼:如bootstrap代碼等,第三方插件代碼)
如果我們沒有配置靜态檔案會
前端頁面的靜态檔案的導入
第一步:
首先需要在配置檔案settings.py中進行配置(一般在配置檔案的末尾)
STATIC_URL = '/static/' # 這個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') # 真正的檔案夾路徑
]
配置完成後,使用者才可以根據路徑真正的使用靜态檔案夾中的檔案
第二步:
導入前配置固定的靜态檔案格式
# 靜态檔案接口字首"動态解析"
{% 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>
# 利用解析器 動态擷取接口字首
兩步都配置完成之後,我們就可以使用靜态檔案中的内容了
二.request方法初識
form表單post請求的實作
form表單的預設請求是get請求,get請求也能攜帶一些資料量較小的資料,攜帶的方式是在url後面:?+資料
http://127.0.0.1:8000/login/?username=zekai&password=123
這個?後面就是get請求攜帶的資料
當我們需要傳輸一些資料量較大或者比較隐私的資料如密碼時,我們需要用到post請求
我們可以通過将form表單的method方法修改為post請求
修改完成後還不能實作功能,我們還需要在settings.py配置檔案中注釋掉一個中間件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # 将這行注釋
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
form表單送出資料目的地是由action決定的
1.不寫的情況下,預設往目前位址送出
2.寫字尾,往目前位址加字尾的位址送出
3.寫全路徑,往全路徑的位址送出
request方法
request方法是在view.py視圖函數檔案中我們傳入的參數
request方法有很多參數,它是我們從前端頁面中擷取的資料
其中request.method是擷取請求方法
傳回值是兩種不同的請求方式(GET或者POST),大寫
判斷不同的請求方式來進行不同的邏輯操作
request.method擷取請求方法
對資料的處理 不單單隻有wsgiref子產品 django後端也進行了大量的資料處理
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')
當我們想取的是單個資料,比如使用者名,密碼等使用'get'方法
當我們想取的是多個資料,比如愛好等,使用'getlist'方法
在判斷完請求方式,書寫我們的後端邏輯時,推薦先處理get請求,即将post請求縮進填寫
視圖函數一般主要會先處理get請求
def login(request):
# 視圖函數針對不同的請求方式 應該有不同的處理邏輯
# if request.method == 'GET':
# print('收到了')
# print(request.method) # 能夠擷取前端請求方式 并且是全大寫的字元串
# print(type(request.method))
# return render(request,'login.html')
# elif request.method == 'POST':
# # 擷取使用者輸入 做相應的邏輯判斷
# return HttpResponse("拿到了 老弟")
if request.method == 'POST':
return HttpResponse('來啦 寶貝')
return render(request,'login.html')
三.Django與資料庫的連接配接
pycharm連接配接mysql資料庫的操作
Django自帶的是sqlite資料庫,這個資料庫比較小,項目中一般使用的是mysql資料庫,這時候就要修改預設資料庫
在pycharm軟體中點選四周邊框縮進的database,點選mysql資料庫
然後下載下傳mysql的驅動,需要注意mysql資料庫的版本,區分自己的資料庫是8.x版本還是5.x版本,一定要裝對
配置完成後就可以在pycharm中進行mysql資料庫的操作
Django連接配接mysql資料庫的操作
django預設使用的是自帶的sqlite資料庫,如果想使用其他的資料庫,除了要在pycharm中配置外,還需要在settings.py配置檔案中配置
1.settings檔案中配置
1.settings檔案中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day51',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'123',
'CHARSET':'utf8'
}
2.還要在項目名下的init檔案或者是應用名下的init檔案中告訴django不要使用預設的mysqldb連接配接mysql,而是使用pymysql,否則會報錯
import pymysql
pymysql.install_as_MySQLdb()
四.Django的orm簡介
django的orm也是對象關系映射
ORM對象關系映射
表 類
一條條記錄 對象
字段對應的值 對象的屬性
首先需要在應用下的models.py中書寫模型類
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參數
當書寫了模型類之後必須執行資料庫遷移(同步)指令(***************)
兩步操作:1.在指令行中輸入python3 manage.py makemigrations
2.在指令行中繼續輸入python3 manage.py migrate
第一步僅僅是在migrations檔案夾中記錄了資料庫的修改,并不會直接操作資料
第二步才是真正的修改資料庫中的資料,真正的将類的操作同步到了資料庫
注意:隻要懂了models中任何和資料庫相關的代碼,就必須重新執行上述的兩條指令,缺一不可
執行了兩步代碼會建立一系列的檔案夾
這兩條指令有簡便方法,但是不推薦前期使用,先把基礎指令熟練了再使用簡便的
五.字段的增删查改
當建立表時建立的字段需要聲明字段名=字段類型(),預設值,是否為主鍵等可以不寫
在django orm中每張表都有主鍵字段,我們可以自己聲明,但如果不寫,django會預設給表建立一個名為id的主鍵字段
表字段的增
當一張表已經建立出來之後還想添加字段,我們可以直接在建立的類中添加具體的字段,但是設定字段的時候django會将讓我們對已存在的值做出選擇
針對這種情況,我們有兩種解決方法:
1.給新增的字段設定預設值
addr = models.CharField(max_length=32,default='China') # default該字段預設值
2.給新增的字段設定為:允許為空
age = models.IntegerField(null=True) # 該字段允許為空
新增完後需要執行資料庫遷移的兩步指令
表字段的改
修改字段的名字或者字段類型等,我們可以直接修改,修改完成後一定要執行資料庫遷移的兩步指令
表字段的删(慎用)
删除字段 直接在models.py中注釋該字段 然後重新執行兩條指令即可
注意:執行完之後 表中該字段所對應的所有的資料全部删除
并且一般情況下 基本是不會用到真正意義上的删除,因為删除字段對應的值也被删除了
六.資料的增删查改
資料的查
查指定的資料
# 1.查詢資料
# 1.1 get()
# user_obj = models.User.objects.get(username=username) # select * from user where username='jason'
# """
# get方法 能夠直接拿到資料對象本身 但是 當查詢條件不存在的時候 會直接報錯 所有不推薦使用
# """
# print(user_obj)
# print(user_obj.username)
# print(user_obj.password)
# 1.2 filter()
# res = models.User.objects.filter(username=username,password=password)
"""
filter查詢出來的結果是一個"清單 清單内放的才是一個個的資料對象本身"
當查詢條件不存在的時候 不會報錯 隻會傳回一個空清單
filter括号内 支援寫多個參數 并且參數與參數之間是and的關系
"""
# print(res.query) # 隻有querySet對象才可以直接點query檢視年内部對應的sql語句
# 1.filter拿到的結果就是一個querySet對象(你現在隻需要知道filter拿到的結果就能夠點query檢視sql語句)
"""
SELECT `app01_user`.`id`, `app01_user`.`username`, `app01_user`.`password`
FROM `app01_user`
WHERE (`app01_user`.`username` = jason AND `app01_user`.`password` = 123)
"""
# print(res)
# user_obj = res[0:2]
"""
querySet對象 你可以吧它當做清單操作 取值也可以通過索引取(querySet隻支援正數索引 不支援負數) 還支援切片操作(切出來的結果還是一個querySet對象)
但是不推薦你這麼做
"""
user_obj = models.User.objects.filter(username=username).first() # 拿清單中第一個資料對象
"""
不推薦你使用索引取值 原因在于一旦沒有任何資料 再索引取值會報錯
但是如果用first雖然内部也是按照索引取值 但是沒有資料 也不會報錯 傳回的是None
"""
查所有的資料
# 将user表中的資料全部查出
data = models.User.objects.all() # select * from user
"""
拿到的也是一個querySet對象
"""
資料的增
# orm插入資料
# 1.create()
# res = models.User.objects.create(username=username,password=password) # insert into user(username,password) values(username,password)
# """
# create方法能夠新增資料 并且有一個傳回值
# 傳回值就是新增的資料對象本身
# """
# print(res)
# print(res.username)
# print(res.password)
# 2.利用對象
user_obj = models.User(username=username,password=password)
user_obj.save()
資料的删
# 根據使用者想要删除的資料的id值 取資料庫中删除資料
# 擷取到id值
delete_id = request.GET.get('id')
# 拿着id去資料庫中删除
models.User.objects.filter(id=delete_id).delete() # delete from user where id = delete_id;
資料的改
# 更新資料
# 方式1:
models.User.objects.filter(id=edit_id).update(username=username,password=password)
# sql語句:update user set username = username,password = password where id = edit_id
"""
filter拿到是一個清單 filter操作其實都是批量操作
如果filter結果清單中有多個資料 那麼會一次性全部修改
類似于for循環一個個修改
"""
# 方式二(不推薦使用)
edit_obj.username = username
edit_obj.password = password
edit_obj.save()
"""
第二種方式會從頭到尾将所有的字段全部修改一遍 效率極低
"""
七.使用者資料管理系統對資料的增删改查
基本流程
使用者的增删改查
1.通過orm展示所有的到前端
all()
模闆文法for循環
2.添加新增按鈕 (使用者的新增操作)
a标簽的href直接觸發後端邏輯
create()
3.添加編輯 删除按鈕
編輯
删除
利用get請求攜帶參數的特點 在url的後面跟上對應資料的id值
request.GET.get()
如果是編輯
重新渲染一個頁面 将編輯對象傳遞到前端
如果是删除
直接利用filter(...).delete()
轉載于:https://www.cnblogs.com/sxchen/p/11531108.html