python 全棧開發,Day78(Django元件-forms元件)
一、Django元件-forms元件
forms元件
django中的Form元件有以下幾個功能:
- 生成HTML標籤
- 驗證使用者資料(顯示錯誤資訊)
- HTML Form提交保留上次提交資料
- 初始化頁面顯示內容
校驗欄位功能
之前寫的檢視函式,提交的資料,沒有做校驗,就新增到資料庫裡面了。這樣是不對的!
比如:使用者名稱,必須要符合一定的長度。密碼複雜度,等等。
forms元件最大的作用,就是做資料校驗。
普通做法,一個一個寫校驗規則,沒有解耦。校驗規則,都在檢視函式裡面。
新建專案formDemo
修改urls.py,新增路徑index
from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), ]View Code
修改views.py,新增index檢視函式
form元件先放到檢視函式
單獨起一個類,後續會分離出來
from django.shortcuts import render # Create your views here. from django import forms #View Code必須匯入模組 class DemoForm(forms.Form): # 必須繼承Form #限制資料為字串,最大長度32 name = forms.CharField(max_length=32) age = forms.IntegerField() # 限制為數字 email = forms.EmailField() # 限制為郵箱格式 def index(request): return render(request,"index.html")
templates新增index.html,裡面是空的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> </body> </html>View Code
開啟Pycharm,點選左下角的Django Console
輸入以下命令,匯入檢視函式的DemoForm類
from app01.views import DemoForm
效果如下:
DemoForm類是用來做校驗的,它接收一個字典。字典必須包含2個key,分別是name,age,email
測試一個字典資料
執行下面2個命令
form=DemoForm({"name":"xiao","age":"21","email":"[email protected]"}) form.is_valid()
效果如下:輸出True
解釋:
is_valid()表示執行校驗,如果3個key都符合要求,輸出True
測試1:age不符合
3個必須同時成立才行
在DemoForm裡面,等式左邊對應的是key,等式右邊對應校驗規則
它有一個預設規則,不能為空
測試2:少一個欄位
測試3:加一個額外的key-value呢?
從結果上來看,也是可以通過的。
它只校驗指定的欄位,那麼額外的鍵值,會忽略。
網頁校驗
修改urls.py,增加路徑addbook
from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), path('addbook/', views.addbook), ]View Code
修改views.py,增加addbook檢視函式,完整程式碼如下:
from django.shortcuts import render,HttpResponse # Create your views here. from django import forms # 必須匯入模組 class UserForm(forms.Form): # 必須繼承Form #限制資料為字串,最小長度4,最大長度12 name = forms.CharField(min_length=4,max_length=12) age = forms.IntegerField() # 限制為數字 #限制長度為11位 tel = forms.CharField(min_length=11,max_length=11) def index(request): return render(request,"index.html") def addbook(request): if request.method == "POST": # 將post資料傳給UserForm form = UserForm(request.POST) if form.is_valid(): # 驗證資料 print("success") else: print("fail") return HttpResponse("ok") return render(request,"addbook.html")View Code
templates新增addbook.html
做表單校驗的時候,一定要注意,表單的name和class的屬性必須一一對應
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>新增使用者</h3> <form action="" method="post"> {% csrf_token %} <lable>姓名</lable><input type="text" name="name"/><br/> <lable>年齡</lable><input type="text" name="age"/><br/> <lable>郵箱</lable><input type="text" name="email"/><br/> <lable>手機號碼</lable><input type="text" name="tel"/> <br/> <input type="submit"> </form> </body> </html>View Code
網頁訪問新增頁面,輸出資訊
提交之後,效果如下:
Pycharm控制檯輸出:success
空表單直接提交
Pycharm控制檯輸出:fail
is_valid()
form.is_valid() 它做了2件事情:
1.將資料傳給form
2.將驗證資料拆分到2個容器中
self.cleaned_data= {} 表示乾淨的資料
self.error = {} 表示驗證不通過的資料
self表示UserForm類的例項物件
addbook檢視函式
def addbook(request): if request.method == "POST": print(request.POST) # 將post資料傳給UserForm form = UserForm(request.POST) if form.is_valid(): # 驗證資料 print("###success###") print(form.cleaned_data) print(form.errors) else: print("###fail###") print(form.cleaned_data) print(form.errors) print(type(form.errors)) return HttpResponse("ok") return render(request,"addbook.html")View Code
再次提交資料
Pycharm控制檯輸出:
<QueryDict: {'tel': ['12345678910'], 'email': ['[email protected]'], 'name': ['xiao'], 'age': ['23'], 'csrfmiddlewaretoken': ['wv7VhRwG4YvEO7SqE9qsMnpO4RpH1ys1KdiOrwgnrN3WRgW0IH8prXSUMCgdMz7u']}> ###success### {'tel': '12345678910', 'age': 23, 'name': 'xiao'} <class 'django.forms.utils.ErrorDict'>View Code
雖然POST傳送了5個鍵值,但是UserForm只校驗3個鍵值。
form.cleaned_data 輸出了3個鍵值
form.errors 輸出的內容空,它的型別為ErrorDict
只要有一個錯誤,就會走else
錯誤資料演示
修改views.py,修改UserForm,增加郵箱
class UserForm(forms.Form): # 必須繼承Form #限制資料為字串,最小長度4,最大長度12 name = forms.CharField(min_length=4,max_length=12) age = forms.IntegerField() # 限制為數字 email = forms.EmailField() # 限制為郵箱格式 #限制長度為11位 tel = forms.CharField(min_length=11,max_length=11)View Code
輸入一個錯誤的表單
Pycharm控制檯輸出:
###fail### {'name': 'awew', 'age': 12, 'tel': '12345678910'} <ul class="errorlist"><li>email<ul class="errorlist"><li>Enter a valid email address.</li></ul></li></ul>View Code
form.errors輸出了一段Html標籤,提示郵箱格式錯誤
提取email錯誤資訊
修改UserForm
def addbook(request): if request.method == "POST": # 將post資料傳給UserForm form = UserForm(request.POST) print(request.POST) if form.is_valid(): # 驗證資料 print("###success###") print(form.cleaned_data) # 所有乾淨的欄位以及對應的值 # ErrorDict : {"校驗錯誤的欄位":["錯誤資訊",]} print(form.errors) print(type(form.errors)) # 列印 else: print("###fail###") print(form.cleaned_data) print(form.errors) # 獲取email錯誤資訊,返回一個錯誤列表,可以切片 print(form.errors.get("email")) # 獲取第一個錯誤資訊 print(form.errors.get("email")[0]) return HttpResponse("ok") return render(request,"addbook.html")View Code
Pycharm控制檯輸出:
###fail### [06/Jul/2018 22:33:41] "POST /addbook/ HTTP/1.1" 200 2 {'tel': '12345678910', 'age': 12, 'name': 'awew'} <ul class="errorlist"><li>email<ul class="errorlist"><li>Enter a valid email address.</li></ul></li></ul> <ul class="errorlist"><li>Enter a valid email address.</li></ul> Enter a valid email address.View Code
form.errors.get("email") 可以提取email的錯誤資訊,它返回的是一個錯誤列表
通過切片,可以獲取第一個錯誤資訊
渲染標籤功能
渲染方式1
使用自帶的模板屬性渲染
上面講的form表單裡面的元素,是手動寫的。form元件可以幫你實現渲染表單元素!
那麼需要渲染哪些元素,取決於UserForm這個自定義類的屬性來決定的
舉例:
修改addbook檢視函式
def addbook(request): if request.method == "POST": # 將post資料傳給UserForm form = UserForm(request.POST) print(request.POST) if form.is_valid(): # 驗證資料 print("###success###") print(form.cleaned_data) # 所有乾淨的欄位以及對應的值 # ErrorDict : {"校驗錯誤的欄位":["錯誤資訊",]} print(form.errors) print(type(form.errors)) # 列印 else: print("###fail###") print(form.cleaned_data) print(form.errors) # 獲取email錯誤資訊,返回一個錯誤列表,可以切片 print(form.errors.get("email")) # 獲取第一個錯誤資訊 print(form.errors.get("email")[0]) return render(request, "adduser.html", {"form":form}) else: form = UserForm() return render(request,"addbook.html",{"form":form})View Code
修改addbook.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>新增使用者</h3> <form action="" method="post"> {% csrf_token %} {{ form.as_p }} <br/> <input type="submit"> </form> </body> </html>View Code
as_p是一個特殊的屬性,常見的有:
{{ form.as_table }}
以表格的形式將它們渲染在<tr>
標籤中{{ form.as_p }}
將它們渲染在<p>
標籤中{{ form.as_ul }}
將它們渲染在<li>
標籤中
訪問頁面,效果如下:
使用瀏覽器工具,檢視html程式碼
它使用了P標籤來包裹
lable的for屬性和input的id屬性是對應的。id的名字和UserForm類定義的屬性是類似的,加了id_字首。
lable的顯示的文字和UserForm類定義的屬性是一樣的,首字母大寫了!
input的name屬性和UserForm類定義的屬性是一樣的
預設自帶required屬性,不允許內容為空。
minlength的屬性來源於UserForm類的定義。
注意:form元件只能渲染表單裡面的元素,比如input標籤。除此之外,其他的需要手寫!
它的樣式,太醜了!
渲染方式2
使用自定義的標籤來包裹form變數
舉例:
更改addbook.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>新增使用者</h3> <form action="" method="post"> {% csrf_token %} <div> <p>姓名</p> {{ form.name }} </div> <div> <p>年齡</p> {{ form.age }} </div> <div> <p>郵箱</p> {{ form.email }} </div> <div> <p>手機號碼</p> {{ form.tel }} </div> <input type="submit"> </form> </body> </html>View Code
重新整理網頁,效果如下:
渲染方式3
使用for迴圈渲染
修改addbook.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>新增使用者</h3> <form action="" method="post"> {% csrf_token %} {% for field in form %} <div> <label for="">{{ field.label }}</label> {{ field }} </div> {% endfor %} <input type="submit"> </form> </body> </html>View Code
重新整理網頁,效果如下:
field.label 表示UserForm類定義的屬性名。注意:它不是html的label標籤!
field 表示input輸入框,由forms元件渲染
顯示中文
將label換成中文,需要增加label屬性
修改views.py裡面的UserForm類
class UserForm(forms.Form): # 必須繼承Form #限制資料為字串,最小長度4,最大長度12 name = forms.CharField(min_length=4,max_length=12,label="姓名") age = forms.IntegerField(label="年齡") # 限制為數字 email = forms.EmailField(label="郵箱") # 限制為郵箱格式 #限制長度為11位 tel = forms.CharField(min_length=11,max_length=11,label="手機號碼")View Code
重新整理網頁,效果如下:
美化input輸入框
需要使用bootstrap
修改urls.py,修改路徑
urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), path('adduser/', views.adduser), ]View Code
修改views.py,將addbook重名為adduser
def adduser(request): if request.method == "POST": # 將post資料傳給UserForm form = UserForm(request.POST) print(request.POST) if form.is_valid(): # 驗證資料 print("###success###") print(form.cleaned_data) # 所有乾淨的欄位以及對應的值 # ErrorDict : {"校驗錯誤的欄位":["錯誤資訊",]} print(form.errors) print(type(form.errors)) # 列印 else: print("###fail###") print(form.cleaned_data) print(form.errors) # 獲取email錯誤資訊,返回一個錯誤列表,可以切片 print(form.errors.get("email")) # 獲取第一個錯誤資訊 print(form.errors.get("email")[0]) return render(request, "adduser.html", {"form":form}) else: form = UserForm() return render(request,"adduser.html",{"form":form})View Code
將addbook.html,重新命名為adduser.html
引入bootstrap,程式碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h3>新增使用者</h3> <form action="" method="post"> {% csrf_token %} {% for field in form %} <div> <label for="">{{ field.label }}</label> {{ field }} </div> {% endfor %} <input type="submit" class="btn btn-success btn-sm"> </form> </div> </div> </div> </body> </html>View Code
訪問url: http://127.0.0.1:8000/adduser/
效果如下:
這裡面input用的還是預設樣式,只要給input標籤增加class="form-group",就有美化效果!
由於input是form元件渲染的,不能直接新增class,需要在UserForm類裡面,指定class
修改UserForm類之前,匯入一個模組widgets
Widgets
Widget 是Django 對HTML 輸入元素的表示。Widget 負責渲染HTML和提取GET/POST 字典中的資料。
如果你想讓某個Widget 例項與其它Widget 看上去不一樣,你需要在Widget 物件例項化並賦值給一個表單欄位時指定額外的屬性(以及可能需要在你的CSS 檔案中新增一些規則)
修改views.py,完整程式碼如下:
from django.shortcuts import render,HttpResponse from django import forms # 必須匯入模組 from django.forms import widgets # Create your views here. class UserForm(forms.Form): # 必須繼承Form #定義變數,專門給text型別的輸入框新增class wid = widgets.TextInput(attrs={"class":"form-control"}) #限制資料為字串,最小長度4,最大長度12 name = forms.CharField(min_length=4,max_length=12,label="姓名",widget=wid) age = forms.IntegerField(label="年齡",widget=wid) # 限制為數字 # 限制為郵箱格式 email = forms.EmailField(label="郵箱",widget=widgets.EmailInput(attrs={"class":"form-control"})) #限制長度為11位 tel = forms.CharField(min_length=11,max_length=11,label="手機號碼",widget=wid) def index(request): return render(request,"index.html") def adduser(request): if request.method == "POST": # 將post資料傳給UserForm form = UserForm(request.POST) print(request.POST) if form.is_valid(): # 驗證資料 print("###success###") print(form.cleaned_data) # 所有乾淨的欄位以及對應的值 # ErrorDict : {"校驗錯誤的欄位":["錯誤資訊",]} print(form.errors) print(type(form.errors)) # 列印 else: print("###fail###") print(form.cleaned_data) print(form.errors) # 獲取email錯誤資訊,返回一個錯誤列表,可以切片 print(form.errors.get("email")) # 獲取第一個錯誤資訊 print(form.errors.get("email")[0]) return render(request, "adduser.html", {"form":form}) else: form = UserForm() return render(request,"adduser.html",{"form":form})View Code
解釋:
widget等式右邊,可以指定多種型別的輸入框,比如:TextInput,EmailInput,DateInput...
預設是TextInput
attrs 表示設定css樣式,它接收一個字典,可以寫多個css樣式!
修改adduser.html
給div增加class="form-group",表示調整上下間距
col-md-offset-2 表示偏移距離
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-2"> <h3>新增使用者</h3><br/> <form action="" method="post"> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="">{{ field.label }}</label> {{ field }} </div> {% endfor %} <br/> <input type="submit" class="btn btn-success btn-sm"> </form> </div> </div> </div> </body> </html>View Code
重新整理網頁,效果如下:
顯示錯誤與儲存輸入資訊功能
儲存輸入資訊功能
比如部落格園的註冊頁面,連結如下:
直接提交空資料,頁面會提示
那麼form元件,也是可以實現這個效果
修改adduser檢視函式
def adduser(request): if request.method == "POST": # 將post資料傳給UserForm form = UserForm(request.POST) print(request.POST) if form.is_valid(): # 驗證資料 print("###success###") print(form.cleaned_data) # 所有乾淨的欄位以及對應的值 # ErrorDict : {"校驗錯誤的欄位":["錯誤資訊",]} print(form.errors) print(type(form.errors)) # 列印 # return HttpResponse("新增成功") else: print("###fail###") # print(form.cleaned_data) print(form.errors) # # 獲取email錯誤資訊,返回一個錯誤列表,可以切片 # print(form.errors.get("email")) # # 獲取第一個錯誤資訊 # print(form.errors.get("email")[0]) return render(request, "adduser.html") # return render(request, "adduser.html", {"form":form}) else: # 預設是get請求(位址列輸入訪問時) form = UserForm() # 沒有表單資料的form return render(request,"adduser.html",{"form":form})View Code
直接提交空資料,頁面有錯誤提示
注意:這個提示是bootstrap做的,不是form元件
雖然jquery可以直接對錶單進行驗證,判斷為空,或者其他規則。但是客戶端瀏覽器的js程式碼,是可以跳過驗證的。直接提交資料給伺服器,如果伺服器沒有做資料校驗,那麼將面臨風險!
修改adduser.html,在form標籤後面增加novalidate,表示關閉bootstrap表單驗證
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-2"> <h3>新增使用者</h3><br/> <form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="">{{ field.label }}</label> {{ field }} </div> {% endfor %} <br/> <input type="submit" class="btn btn-success btn-sm"> </form> </div> </div> </div> </body> </html>View Code
重新整理頁面,填3個值,最後一個故意不填寫
點選提交,效果如下:
發現剛剛增加的資料,沒有了。這樣使用者體驗不好!使用者得小心翼翼的輸入每一個數據!
檢視Pycharm控制檯輸出:
###fail### <ul class="errorlist"><li>tel<ul class="errorlist"><li>This field is required.</li></ul></li></ul>View Code
發現它走了else的程式碼,使用render時,沒有傳值。導致頁面為空!
修改views.py
給adduser.html傳一個form。注意:此時的form變數是帶有表單資料的!
def adduser(request): if request.method == "POST": # 將post資料傳給UserForm form = UserForm(request.POST) print(request.POST) if form.is_valid(): # 驗證資料 print("###success###") print(form.cleaned_data) # 所有乾淨的欄位以及對應的值 # ErrorDict : {"校驗錯誤的欄位":["錯誤資訊",]} print(form.errors) print(type(form.errors)) # 列印 return HttpResponse("新增成功") else: print("###fail###") # print(form.cleaned_data) print(form.errors) # # 獲取email錯誤資訊,返回一個錯誤列表,可以切片 # print(form.errors.get("email")) # # 獲取第一個錯誤資訊 # print(form.errors.get("email")[0]) return render(request, "adduser.html", {"form":form}) else: # 預設是get請求(位址列輸入訪問時) form = UserForm() # 沒有表單資料的form return render(request,"adduser.html",{"form":form})View Code
再次重新整理頁面,資料就回來了!
資料怎麼就回來了呢?
因為既然是POST請求,而且攜帶了POST資料,必然執行了form.is_valid()
雖然沒有驗證通過,但是執行下面一句程式碼時
return render(request, "adduser.html", {"form":form})
此時的form是含有POST表單資料的,所以頁面才會渲染出來!
注意:當input屬性為password時,是不會渲染的!除此之外,其他的表單元素,是可以渲染的!
提交一個正確的資料
提示新增成功
顯示錯誤資訊
約定俗成,使用span標籤來顯示錯誤資訊
修改adduser.html,增加span標籤
相關推薦
python 全棧開發,Day78(Django元件-forms元件)
一、Django元件-forms元件 forms元件 django中的Form元件有以下幾個功能: 生成HTML標籤 驗證使用者資料(顯示錯誤資訊) HTML Form提交保留上次提交資料 初始化頁面顯示內容 校驗欄位功能 之前寫的檢視函式,提交的資料,
python 全棧開發,Day79(Django的使用者認證元件,分頁器)
一、Django的使用者認證元件 使用者認證 auth模組 在進行使用者登陸驗證的時候,如果是自己寫程式碼,就必須要先查詢資料庫,看使用者輸入的使用者名稱是否存在於資料庫中; 如果使用者存在於資料庫中,然後再驗證使用者輸入的密碼,這樣一來就要自己編寫大量的程式碼。 事實上,Djang
(轉)python 全棧開發,Day76(Django元件-cookie,session)
昨日內容回顧 1 json 輕量級的資料交換格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy()
(轉)python 全棧開發,Day67(Django簡介)
昨日內容回顧 1. socket建立伺服器 2. http協議: 請求協議 請求首行 請求方式 url?a=1&b=2 協議 請求頭 key:value 請求體 a=1&b
(轉)python 全棧開發,Day68(Django的路由控制)
昨日內容回顧 1 MVC和MTV MTV 路由控制層(分發哪一個路徑由哪一個檢視函式處理) V : views (邏輯處理) T : templates (存放html檔案) M :
(轉)python 全棧開發,Day73(django多表新增,基於物件的跨表查詢)
昨日內容回顧 多表方案: 如何確定表關係呢? 表關係是在2張表之間建立的,沒有超過2個表的情況。 那麼相互之間有2條關係線,先來判斷一對多的關係。 如果其中一張表的記錄能夠對應另外一張表的多條記錄,那麼關係線成立! 如果只
(轉)python 全棧開發,Day75(Django與Ajax,檔案上傳,ajax傳送json資料,基於Ajax的檔案上傳,SweetAlert外掛)
昨日內容回顧 基於物件的跨表查詢 正向查詢:關聯屬性在A表中,所以A物件找關聯B表資料,正向查詢 反向查詢:關聯屬性在A表中,所以B物件找A物件,反向查詢 一對多: 按欄位:xx book --
python 全棧開發,Day84(django請求生命週期,FBV和CBV,ORM拾遺,Git)
一、django 請求生命週期 流程圖: 1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中. 2. url經過Django中的wsgi,再經過Django的中介軟
(轉)python 全棧開發,Day72(昨日作業講解,昨日內容回顧,Django多表建立)
昨日作業講解 1.圖書管理系統 實現功能:book單表的增刪改查 1.1 新建一個專案bms,建立應用book。過程略... 1.2 手動建立static目錄,並在目錄裡面建立css資料夾,修改settings.py,設定static的目錄位置 STATI
(轉)python 全棧開發,Day70(模板自定義標籤和過濾器,模板繼承 (extend),Django的模型層-ORM簡介)
昨日內容回顧 檢視函式: request物件 request.path 請求路徑 request.GET GET請求資料 QueryDict {} request.POST POST請求資料 Que
(轉)python 全棧開發,Day74(基於雙下劃線的跨表查詢,聚合查詢,分組查詢,F查詢,Q查詢)
昨日內容回顧 # 一對多的新增方式1(推薦) # book=Book.objects.create(title="水滸傳",price=100,pub_date="1643-4-12",publish_id=1) # print(book.title) # 一對多的新增
(轉)python 全棧開發,Day71(模型層-單表操作)
昨日內容回顧 1. {% include '' %} 2. extend base.html: <html> ..... ..... .....
python 全棧開發,Day81(部落格系統個人主頁,文章詳情頁)
一、個人主頁 隨筆分類 需求:查詢當前站點每一個分類的名稱以及對應的文章數 完成這個需求,就可以展示左側的分類 它需要利用分組查詢,那麼必須要會基於雙下劃線的查詢。 基於雙下劃線的查詢,簡單來講,就是用join。將多個表拼接成一張表,那麼就可以單表操作了! 表關係圖 圖中
python 全棧開發,Day82(點贊和踩滅,使用者評論)
一、點贊和踩滅 樣式 先來做樣式,修改article_detail.html,增加div_digg的div {% extends "base.html" %} {% block content %} <div class="article_info
python 全棧開發,Day80(部落格系統分析,部落格主頁展示)
一、部落格系統分析 資料庫的構建 首先,我們分析一個部落格系統的功能: 一個部落格可以有多個標籤(多對多) 一個部落格可以有多條評論(一對多) 一個部落格只可以有一個類別(多對一) 接下來,我們分析關係的屬性: 部落格:標題,作者,內容,釋出時間,分類(外來鍵),
python 全棧開發,Day83(部落格系統子評論,後臺管理,富文字編輯器kindeditor,bs4模組)
一、子評論 必須點選回覆,才是子評論!否則是根評論點選回覆之後,定位到輸入框,同時加入@評論者的使用者名稱 定位輸入框 focus focus:獲取物件焦點觸發事件 先做樣式。點選回覆之後,定位到輸入框,加入被評論的使用者名稱 給回覆的a標籤加一個class=reply_btn,關
<python全棧開發基礎>學習過程筆記【6d】列表,字典,元組,知識點復習
ima 技術分享 筆記 python nbsp .com 復習 png cnblogs 、 <python全棧開發基礎>學習過程筆記【6d】列表,字典,元組,知識點復習
python全棧開發基礎【第二十五篇】死鎖,遞歸鎖,信號量,Event事件,線程Queue
random 問題 定時器 初始 .get rand true () 進入 一、死鎖現象與遞歸鎖 進程也是有死鎖的 所謂死鎖: 是指兩個或兩個以上的進程或線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用, 它們都將無法推進下去。此時稱系統處於死鎖狀態或系
Python 全棧開發:python叠代器,生成器
gen 多次 try 集合 except iter nbsp toolbar 分享圖片 叠代器 一、什麽是叠代器 #叠代器即叠代的工具,那什麽是叠代呢? #叠代是一個重復的過程,每次重復即一次叠代,並且每次叠代的結果都是下一次叠代的初始值 while True
2018-5-31-Python全棧開發day12-列表,字典,元組
獲取 color 順序 highlight lis In 4.3 4.2 方法 1.列表 列表是以中括號表示, 以逗號分隔。列表內可以嵌套各種,比如說字符串,列表,元組,字典,可以無限嵌套。 s1=[] 1.1 索引 s1=[‘alex‘,[123],{