寫django之前需要知道的小點
1,路由訪問如果不加斜杠 會內部自動重定向加斜杠的路由
2,所有的html文件默認都寫在templates文件夾下,這是一種約定俗成的規定,一定要檢查settings有沒有配置好
3,所有的靜態文件(css,js,前端第三方類庫)默認都放在static文件夾下,css,js一般需要自己創建
4,html頁面引入外部資源的方式
cdn
本地
靜態文件配置
作用:暴露給外界能夠訪問服務器靜態文件夾下面所有的資源
STATIC_URL = '/static/'
# 靜態文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
STATIC_URL = '/xxx/' # 接口前綴 跟你的靜態文件夾的名字一點關系都沒有
# 默認情況下這個前綴跟靜態文件夾名字一樣!!!
# 靜態文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 就是你的靜態文件夾路徑
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2')
]
# ps:會依次查找列表中所有的靜態文件路徑 找到的話立刻停止,都沒有找到返回404
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請求
注意:出現上面那個403頁面時,需要將MIDDLEWARE的第四條注釋掉
根據客戶端請求方式的不同執行不同的邏輯代碼
def login(request): # 獲取用戶端提交的請求方式 print(request.method) # 拿到的請求方式是全大寫的字符串 if request.method == 'GET': return render(request,'login.html') elif request.method == 'POST': return HttpResponse("收到了 老弟")
個人建議按照下面這種方式書寫 減少代碼冗余及結構混亂的問題
def login(request):
if request.method == 'POST':
return HttpResponse('OK')
return render(request,'login.html')
request方法
request.method:獲取用戶端提交的請求方式
request.POST:可以把它當成一個大字典里面存放了客戶端post提交的所有的數據
request.POST.getlist():一次性獲取value列表里面所有的數據
def login(request): print(request.method) # 拿到的請求方式是全大寫的字符串 if request.method == 'GET': return render(request,'login.html') elif request.method == 'POST': return HttpResponse("收到了 老弟") if request.method == 'POST': print(request.POST) # 你就把它當成一個大字典里面存放了客戶端post提交的所有的數據 # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} > print(request.POST.get('username')) # value雖然是個列表但是獲取value的時候拿到卻是單個元素 # 默認只會取value列表里面的最后一個元素 # request.POST:<QueryDict: {'username': ['jason', 'egon'], 'password': ['123']}> print(request.POST.getlist('username')) # 要想一次性獲取value列表里面所有的數據需要用getlist() # ['jason', 'egon'] print(request.POST['password']) # 不推薦使用該方法獲取數據 return HttpResponse('OK') return render(request,'login.html')
獲取value列表里面所有的元素需要使用getlist 應用場景:用戶的愛好 多選框
get只會獲取到value列表的最后一個元素
print(request.GET) # <QueryDict: {'username': ['jason'], 'password': ['123']}>
request.GET.get('user')
# <QueryDict: {'username': ['jason','egon'], 'password': ['123']}>
request.GET.getlist('username')
pycharm連接數據庫
先選定數據庫,再下載好對應的數據庫驅動
輸入要連接的庫,用戶名和用戶密碼,輸入完成后可以點test connection測試能不能連接成功
django連接數據庫
1.需要修改配置文件
django默認連接自帶的sqlite3數據庫,我們要連mysql需要做一些修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day54',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'123'
}
}
ps:鍵必須都是大寫
2.告訴django用pymysql替換它默認mysqldb模塊連接數據庫
方式1:在你的項目文件夾下面的__init__.py
方式2:也可以在你的應用文件夾下面的__init__.py
# 固定寫法
import pymysql
pymysql.install_as_MySQLdb() # 告訴django用pymysql代替mysqldb連接數據庫
ORM回顧
對象關系映射
類 》》》 表
對象 》》》 表記錄
對象的屬性 》》》 一條記錄某個字段對應的值
django的orm不能夠自動幫你創建庫,但是可以自動幫你創建表
提示:一個django項目就使用一個庫,不要多個django項目使用一個庫
數據庫遷移(同步)命令(******)
python3 manage.py makemigrations 將你的數據庫變動記錄到一個小本本上(並不會幫你創建表)
python3 manage.py migrate 將你的數據庫變動正在同步到數據庫中
新增數據
# 操作數據庫user表插入數據
# 方式1:
user_obj = models.User.objects.create(name=username,password=password)
返回值就是這個表對象,可以用user_obj.pk(主鍵對應的值),user_obj.name,user_obj.age這些方法屬性
# 方式2:
user_obj = models.User(name=username,password=password)
user_obj.save() # 對象調用save方法保存到數據庫
查詢數據
user_list = models.User.objects.all() # 獲取user表所有的數據
# 只要是QuerySet就可以點query查看獲取到當前QuerySet對象的內部sql語句
print(user_list.query)
利用a標簽href屬性 可以指定頁面跳轉的路徑 href可以寫全路徑 但是推薦寫后綴即可
<a href="/reg/" class="btn btn-success">添加數據</a>
# 注意 路徑的書寫一定要加斜杠
重定向 可以寫別人的網址也可以是自己的路徑
return redirect('/userlist')
return redirect('/userlist/')
queryset對象支持索引取值 但是不推薦你使用 推薦使用自帶的.first()幫你獲取第一條數據
刪除
models.User.objects.filter(id=1).delete() # 會將queryset所有的數據對象全部刪除
查詢數據需要注意的是你獲取到的到底是一個queryset還是一個數據對象
user_query = models.User.objects.filter(id=edit_id).first() # 如果你是要獲取數據對象first千萬別忘了
# filter當條件不存在的情況下會返回一個空的queryset對象
<QuerySet []> <class 'django.db.models.query.QuerySet'>
user_obj = models.User.objects.get(id=edit_id) # 用get可以直接獲取到數據對象本身但是查詢條件不存在的情況下直接報錯