一、Django的工作流
1:用戶通過瀏覽器輸入相應的 URL 發起 HTTP 請求(一般是 GET/POST)
2:Django 接受到請求,檢測 urls.py 文件,找到和用戶輸入的 URL 相匹配的項,並調用該 URL 對應的視圖函數(view),例如,通常來說 urls.py 文件里的代碼是這樣的:
url(r'^homepage/$', views.home_page)
3:視圖函數被調用后,可能會訪問數據庫(Model)去查詢用戶想要請求的數據,並加載模板文件(Template),渲染完數據后打包成 HttpResponse 返回給瀏覽器(Http協議)
二、准備工作
大致工作流程就是這樣,從流程可以看出,我們需要做的就是:

#准備工作,創建app python3 manage.py startapp app01 #在配置文件(settings-->INSTALLED_APPS)中添加 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', #或者app01 ]
三、編寫url、Http請求的視圖(view)函數
#1、編寫相應的 url(urls文件中) from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), ] #2、編寫處理 Http 請求的視圖函數(View) def login(request): pass #功能代碼塊,暫用pass填充
四、搭建需要渲染的模板(template)
#3、編寫需要渲染的模板(template) #3.1通常建立static文件夾放入靜態文件(bootstrap,js,css,image),然后在settings中配置路徑 STATIC_URL = '/static/' #接口前綴,和靜態文件夾static無關 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') #靜態文件夾路徑 ] #3.2登錄Html文件搭建 <body> <div class="container"> <div class="row"> <h1>登錄頁面</h1> <div class="col-md-6 col-md-offset-3"> #提交數據到后台使用form表單,action指定提交地址(3種方式) #1.全路徑 <form action="http://127.0.0.1:8080/login/"> #2.只寫路徑后綴 <form action="/login/"> #3.不寫,默認當前路徑(http://127.0.0.1:8080/login/)提交 <form action=""> <p>username:<input type="text" class="form-control" name="username"></p> <p>password:<input type="password" class="form-control" name="password"></p> #提交數據方式:<input type=‘submit’> 或 <button></button> <input type="submit" class="btn btn-success"> </form> </div> </div> </div> </body>
五、具體視圖函數功能實現
5.1登錄視圖測試
#4.1根據用戶請求類型,執行對應功能 ''' 由於form表單提交數據默認get請求,實際提交數據是POST請求,需要修改客戶端的請求類型(獲取客戶端請求類型:request.method)。 通過<form action="" method="post">直接修改會報錯(403),還需注釋settings中 MIDDLEWARE 的'django.middleware.csrf.CsrfViewMiddleware', ''' def login(request): if request.method =='POST': return HttpResponse('OK') return render(request,'login.html')
#4.2獲取用戶數據(GET/POST請求獲取方式一致) ''' 嘗試打印 print(request.POST),可將其看做字典存放了post提交的數據。 字典中的value是列表結構,但取值時拿到的是單個元素; 獲取列表元素: request.POST.get('username');默認獲取列表最后一個元素。
request.POST['username'];不推薦使用(鍵不存在直接報錯)
若字典中value有多個元素可使用(用戶愛好,多選框): request.POST.getlist('username'); ''' def login(request): if request.method =='POST': print(request.POST) #可將其看做字典,存放了post提交的所有數據 #獲取列表數據,使用的username是根據前端<input...name="username"> name屬性 print(request.POST.get('username')) print(request.POST['username'] print(request.POST.getlist('username') #獲取列表中所有數據 return HttpResponse('OK') return render(request,'login.html')
5.2數據庫的連接和配置
#4.3連接數據庫
''' 使用PyCharm連接數據庫: DataBase-->DataSource-->下載驅動-->配置參數-->Test Connection Django連接數據庫配置(settings文件): 1.修改配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day55', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '51cwdqgcs',}} 2.用pymysql替換默認的mysql_db模塊連接數據庫 在項目文件夾或應用文件下__init__.py寫入 import pymysql pymysql.install_as_MySQLdb() '''
5.3 Django的ORM
class User(models.Model): #在app01-->models中創建類繼承 models.Model id = models.AutoField(primary_key=True) #添加相應字段 name = models.CharField(max_length=32) #CharField定義時必須指定max_length參數 password = models.CharField(max_length=32) 再執行數據庫遷移命令 ''' 1.django的ORM不能自動創建庫(手動創建數據庫),但可以自動創建表。 2. python3 manage.py makemigrations 將數據庫變動記錄到migrations文件夾下 python3 manage.py migrate 將數據庫變動同步到數據庫 '''
5.4通過ORM實現數據庫的增、刪、改、查

#4.5通過測試Djang的ORM(增、刪、改、查) #增 def reg(request): if request.method=='POST': username = request.POST.get('username') password = request.POST.get('password') #操作數據庫user表插入數據 #方法一 #user_obj=models.User.objects.create(name=username,password=password) #方法二 user_obj=models.User(name=username,password=password) user_obj.save() # print(user_obj) # print(user_obj.name) # print(user_obj.password) return HttpResponse('注冊成功') return render(request,'reg.html') #增(完善):在數據展示頁面增加‘添加’數據按鈕 #href屬性指定跳轉的頁面(注冊) <a href="/reg/" class="btn btn-success">添加數據</a> #完成添加數據后,點擊按鈕重定向'數據展示'頁面 return redirect('/userlist/')

#查 def userlist(request): user_list=models.User.objects.all() #獲取所有數據 #user_list是QuerySst對象,點query獲取當前對象內部sql語句 print(user_list.query) #循環打印用戶信息,放入html #for user_obj in user_list: #print(user_obj.password,user_obj.name) return render(request,'userlist.html',locals())

#定義修改視圖函數 def edit(request): if request.method == 'POST': print(request.POST) print(request.GET) username = request.POST.get('username') password = request.POST.get('password') # 獲取編輯對象的id方式 edit_id = request.POST.get('edit_id') # 更新數據庫 models.User.objects.filter(id=edit_id).update (name=username,password=password) #重定向'數據展示' 頁面 return redirect('/userlist') # 獲取用戶想要修改的數據的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) # print(user_obj,type(user_obj)) # 將當前數據渲染到一個編輯頁面上 return render(request,'edit.html',locals())

#刪除 #在數據展示頁面增加‘刪除’數據按鈕,在指定跳轉路徑后拼接用戶ID(GET請求可以攜帶的參數就是在路徑后拼接) <a href="/delete_user/?delete_id={{ user_obj.pk }}" class="btn btn-warning">刪除</a> #定義刪除視圖函數 def delete_user(request): delete_id=request.GET.get('delete_id') # res_1 = models.User.objects.filter(id=delete_id) # print(res_1) # QuerySet對象 <QuerySet [User:jason]> #QuerySet對象索引取值獲取數據對象 # res = models.User.objects.filter(id=delete_id)[0] # res=models.User.objects.filter(id=delete_id).first() # print(res) #數據對象,才能res.id取值 #刪除queryset內所有數據對象 res = models.User.objects.filter(id=delete_id).delete() return redirect('/userlist/')