登陸功能
login.html
action:提交到後臺的地址三種寫法: 路由訪問若是不加斜槓 會內部自動重定向加斜槓的路由 1 全路徑 <form action="http://127.0.0.1:8000/login/"> 2 只寫路徑後綴 <form action="/login/"> 推薦用 3 不寫 (默認往當前路徑提交) form表單默認是get請求 method post方式 form表單觸發提交數據的動做兩種方式 <input type="submit" value="提交">或<button></button> type不能夠是button <form action="http://127.0.0.1:8000/login" method="post"> <p>用戶名:<input type="text" name="name" class="form-control"></p> <p > 密碼:<input type="password" name="pwd" class="form-control"> </p> <input type="submit" value="提交"> </form>
view
1 request.method ----前臺提交過來請求的方式 2 request.POST(至關於字典)----post形式提交過來的數據,(http請求報文的請求體重) 3 request.POST.get('name') ----推薦用get取值(取出列表最後一個值) 4 request.POST.getlist('name')-----取出列表全部的值_ 5 前臺get方式提交的數據,從request.GET字典裏取
連接數據庫
cursor.execute('select * from user where name=%s and password=%s ',[name,pwd])
全部的靜態文件(css,js,前端第三方類庫)默認都放在static文件夾下css
html頁面引入外部資源的方式 cdn 本地html
靜態文件配置
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
根據客戶端請求方式的不一樣執行不一樣的邏輯代碼
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') 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')
django鏈接數據庫 1.須要修改配置文件 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鏈接數據庫python
什麼是ORM? 對象關係映射 類 》》》 表 對象 》》》 表記錄 對象的屬性 》》》 一條記錄某個字段對應的值mysql
django的orm不可以自動幫你建立庫,可是能夠自動幫你建立表sql
提示:一個django項目就使用一個庫,不要多個django項目使用一個庫數據庫
數據庫遷移(同步)命令(******) python3 manage.py makemigrations 將你的數據庫變更記錄到一個小本本上(並不會幫你建立表) python3 manage.py migrate 將你的數據庫變更正在同步到數據庫中django
新增數據服務器
操做數據庫user表插入數據
方式1:
user_obj = models.User.objects.create(name=username,password=password)函數
方式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能夠直接獲取到數據對象自己可是查詢條件不存在的狀況下直接報錯
編輯
編輯對象的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()
修改模型層裏面的跟表相關的全部的數據,只要你修改了就必須從新執行數據庫遷移命令
python manage.py makemigrations 記錄到小本本上 python manage.py migrate 真正操做數據庫
django請求生命週期
圖書管理系統表設計 書籍表
做者
出版社
外鍵字段名 orm會自動在字段名後面加_id.不管你的字段名有沒有_id
ps:視圖函數必須返回一個HttpResponse對象