若是路由訪問的時候出現css
就把項目中的註釋掉html
登陸功能前端
1 路由訪問若是不加斜槓 會內部自動重定向加斜槓的路由python
全部的靜態文件(css,js,前端第三方類庫)默認都放在static文件下mysql
#靜態文件配置 STATIC_URL = '/static/' #這個是建立項目的時候django已經幫你建立好了 # 靜態文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] # 暴露給外界可以訪問服務器靜態文件夾下面全部的資源 STATIC_URL = '/xxx/' # 接口前綴 跟你的靜態文件夾的名字一點關係都沒有 若是這裏改了 那你本地去引用的時候就須要以/xxx/後面是js 或css樣式 # 默認狀況下這個前綴跟靜態文件夾名字同樣!!! # 靜態文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), # 就是你的靜態文件夾路徑 os.path.join(BASE_DIR,'static1'), os.path.join(BASE_DIR,'static2') ] # ps:會依次查找列表中全部的靜態文件路徑 找到的話馬上中止,都沒有找到返回404
html頁面引入外部資源的方式 cdn 本地引用
form表單觸發提交數據的動做兩種方式sql
<input type="submit"> <button></button>
form提交數據的地址指定及方式 數據庫
action屬性控制提交的地址 方式: 1.全路徑 <form action="http://127.0.0.1:8000/login/"> 2.只寫路徑後綴 <form action="/login/"> 3.不寫 (默認往當前路徑提交) form表單默認是get請求
根據客戶端請求方式的不一樣執行不一樣的邏輯代碼django
def login(request): # 獲取用戶端提交的請求方式 print(request.method) # 拿到的請求方式是全大寫的字符串 GET POST # if request.method == 'GET': # return render(request,'login.html') # elif request.method == 'POST': # return HttpResponse("收到了 老弟") #print(request.POST) #:< QueryDict: {}> 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列表的最後一個元素
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.intrall_as_MySQLdb()
pycharm鏈接數據庫app
鏈接以前先下載一個小插件
django的orm不可以自動幫你建立庫,可是能夠自動幫你建立表
提示:一個django項目就使用一個庫,不要多個django項目使用一個庫
當你在model下面定義好模型表以後在pycharm下面的cmd命令行執行建立表的命令
數據庫遷移命令 python3 manage.py makemigrations #將你的數據庫變更記錄到一個小本本上(並不會幫幫你建立表) python3 manage.py migrate #將你的數據庫變更正在同步到數據庫中
新增數據
操做數據庫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表全部的數據 user_list是一個Queryset 只要是QuerySet就可點query查看獲取到當前QuerySet對象的內部sql語句 print(models.User.objects) #app01.User.objects 後面連表查詢會遇到不少 print(user_list) #<QuerySet [<User: jason>, <User: egon>, <User: tank>]> print(type(user_list)) #<class 'django.db.models.query.QuerySet'> for user_obj in user_list: print(user_obj) #User objecet 就是你models下面那些類實例化的對象 orm關係映射 類 》》》 表 對象 》》》 一條記錄 對象.屬性 》》》 記錄裏面的值
只須要把這個user_list發佈到前端去循環在去點屬性就能夠了
利用a標籤herf屬性 能夠指定頁面跳轉的路徑 herf能夠寫全路徑 可是推薦些後綴便可
<a herf="/reg/" class='btn btn-sussess'>添加數據</a> #注意 路徑的書寫必定要加前斜槓
刪除數據
def delete_user(request): #前端發過來的get請求 路由後面手動拼寫/?delete_id={{ user.pk}}/ #從get請求攜帶的參數中獲取用戶想要刪除的數據id delete_id = request.GET.get('delete_id') res = models.User.objects.filter(id=delete_id) #res此時是Queryset對象 data = models.User.object.filter(id=delete_id)[0] #此時data是數據對象 data1 = models.User.object.filter(id=delete_id).first() #此時data1是數據對象推薦使用.first() 取不到不會報錯 索引取值會報錯爲了程序不崩潰建議使用.first()取數據對象 models.User.objects.filter(id=delete_id).delete() #會將queryset全部的數據對象所有刪除 return redirect('/uesrlist/') #既然上面的res是數據對象你就能夠.query去查看內部執行的sql語句
uesr_obj= models.User.object.get(id=delete_id) #用get能夠直接獲取到數據對象自己可是查詢條件不存在的狀況下會直接報錯 不建議使用
更改數據
def edit(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') #獲取編輯對象的id方式 edit_id = request.POST.get('edit_id') #這裏獲取的是前端隱藏標籤發來的edit_id 能夠獲取重要的數據
edit_id = request.GET.get('edit_id') #就是POST請求能夠獲取GET請求裏面的數據 GET請求獲取不了POST的請求數據 #更新數據庫 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.password = password
#user_obj.save()
return redirect('/uesrlist/')
#獲取用戶想要修改的數據的id 也是前端頁面路由後面手動拼接
edit_id = request.GET.get('edit_id')
#將該數據查詢出來渲染到一個編輯頁面
#查詢書方式1:
user_obj = models.User.objects.filter(id=edit_id).first()
#查詢數據方式2:
#user_obj = models.User.objects.get(id=edit_id)
#將當前數據渲染到一個編輯頁面上
return render(request,'edit.html',locals())
#locals()會將上面定義的kv鍵值對所有發給編輯頁面 恰好編輯頁面就用到了edit_id
html前端頁面 編輯的時候展現原來的數據給用戶看 在標籤裏面 value='user_obj.name'
重定向 能夠寫別人的網址也能夠是本身路徑
return redirect('/uesrlist') return redirect('/userlist/') #新增 刪除 更改數據以後能夠重定向展現頁面
外鍵字段名 orm會自動在字段名後面加上_id 不管你的字段名有沒有_id
寫前端的時候不要亂空格
概括:
request.POST 當成字典 request.GET 當成字典 字典能夠get取值
新增
方式1: models.User.objects.create(k=v,k=v) 方式2: user_obj = models.User(k=v,k=v) user_obj.save()
查詢
models.User.objects #==> app01.User.objects .all #QuerySet對象 全部對象裏面的value[數據對象,數據對象1,數據對象2] .filter() #QuerySet對象 .first() #拿到數據對象 若是是QuerySet裏面數值是多個 [數據對象,數據對象] 直接發回前端 前端for 循環拿到一個個數據對象 QuerySet對象能夠 索引取值[0] 取出數據對象 不建議使用索引取值 .first() 取出數據對象 建議使用 models.User.object.filter(id=1) #==>QuerySet對象 QuerySet對象 .first() 拿到數據對象 .delete() 會將queryset全部的數據對象所有刪除 .update() 會將queryset全部的數據對象所有跟新
獲取對象
方式1: user_obj = models.User.objects.get(id=edit_id) #不建議使用get數據不存在報錯 方式2: user_obj = models.User.objects.filter(id=edit_id).first()