小需求:獲取用戶數據并發送給后端校驗 后端返回不符合校驗規則的提示信息
form組件
1.自動校驗數據
2.自動生成標簽
3.自動展示信息
from django import forms
class MyForm(forms.Form):
username = forms.CharField(min_length=3, max_length=8) # username字段最少三個字符最大八個字符
age = forms.IntegerField(min_value=0, max_value=200) # 年齡最小0 最大200
email = forms.EmailField() # 必須符合郵箱格式
校驗數據的功能(初識)
form_obj = views.MyForm({'username':'jason','age':18,'email':'123'})
form_obj.is_valid() # 1.判斷數據是否全部符合要求
False # 只要有一個不符合結果都是False
form_obj.cleaned_data # 2.獲取符合校驗條件的數據
{'username': 'jason', 'age': 18}
form_obj.errors # 3.獲取不符合校驗規則的數據及原因
{'email': ['Enter a valid email address.']}
1.只校驗類中定義好的字段對應的數據,多傳的不做任何操作
2.默認情況下類中定義好的字段都是必填的
1.首先定義一個forms類
from django import forms
class Myform(forms.Form):
username = forms.CharField(min_length=3, max_length=8) # 最少三位,最大八位
age = forms.IntegerField(min_value=0, max_value=200) # 數字不能小于0,不能大于200
email =forms.EmailField() # 郵箱格式
2.建立視圖函數
def ab_forms_func(request):
# 產生一個空對象
form_obj = MyForm()
# 將產生的空對象傳遞給html文件
return render(request, 'html文件', locals())
3.在html文件中渲染標簽
方式一:
{{ form_obj.as_p }} # 頁面上會自動列出對應的字段名以及輸入框(以p標簽的形式)
{{ form_obj.as_ul }} # 以ul標簽的方式
{{ form_obj.as_table }} # 以table標簽的方式
會直接渲染出所有的字段名,封裝程度高,但是擴展性差,主要用于本地測試,實際項目基本不用
方式二:
{{ form_obj.username.lable }}
{{ form_obj.username }} # 頁面中的寫法是兩個緊挨著,實際效果是會自動渲染出綁定了lable標簽的username輸入框
封裝程度低,擴展性高,但是編寫比較麻煩,實際項目中也不怎么使用
方式三:渲染出的實際效果與方式二一樣,但是編寫比方式二簡單
{% for form in form_obj %}
<p>
{{ form.lable }}
{{ form }}
</p>
{% endfor %}
注意事項:
1.forms組件只負責渲染獲取用戶數據的標簽,其余的form標簽與按鈕都需要我們自己寫
2.前端自帶校驗但是可以被修改,所以我們在使用forms組建的時候可以直接取消前端的校驗,統一由后端校驗
<form action="" novalidate> # 取消前端校驗
當我們輸入的數據不符合規范時,需要給前端一個提示或者說需要將錯誤信息在前端展示出來
后端代碼:
def ab_forms_func(request):
form_obj = MyForm() # 產生一個空對象
if request.method = 'POST':
form_obj = MyForm(request.POST) # request.POST可以看成是一個字典,直接傳給forms校驗
if form_obj.is_valid(): # 校驗數據是否合法,合法的數據會放到cleaned_data中,不合法的放到errors中,其它多余的數據不管
print(form_obj.cleaned_data)
else:
print(form_obj.errors)
return render(request, 'html文件', locals()) # 如果前端返回的是POST請求則將if中的form_obj返回給前端,否則返回第一個form_obj,所以兩個form_obj雖然不一樣,但是名字得一樣
前端代碼:
{% for form in form_obj %}
<p>
{{ form.lable }}
{{ form }}
<span>{{ form.errors.0 }}</span>
</p>
{% endfor %}
正常情況下頁面上顯示的錯誤信息為英文,我們可以將它修改為各國語言
方式一:自定義
我們在定義字段對象的時候可以給字段對象添加一個errors_messages參數
username = forms.CharField(min_length=3, max_length=8, errors_messages={
'min_length': '用戶名最少三個字符',
'max_length': '用戶名最多八個字符',
'required': '用戶名不能為空'
})
添加過errors_messages參數以后傳遞給前端的錯誤信息就會直接從這里面拿取
方式二:修改系統語言環境
在settings配置文件中有一個參數是用來控制系統語言的 LANGUAGE_CODE = 'en-us' 默認為英文
from django.conf import global_settings # global_settings是Django內部真正的配置文件,我們可以配置的系統環境語言在里面都能看到
forms組件針對字段數據的校驗提供了三種類型的校驗方式(三種校驗方式可以一起使用)
1.直接填寫參數
2.使用正則表達式
首先導入一個正則校驗模塊 form django.core.validators import RegexValidator
正則校驗導入以后就可以使用validators參數來編寫正則校驗
phone = forms.CharField(validators=[RegexValidator(r'^[0-9]+$', '請輸入數字')]) # 第一個是正則表達式,第二個是不符合正則校驗返回的內容
3.使用鉤子函數,編寫代碼自定義校驗規則
鉤子函數是在is_valid之后觸發的,在經過前兩個校驗方式之后,合法的數據已經進入到了cleand_data中,鉤子函數就相當于做一個額外的校驗,如果說前兩個校驗是對數據的外表進行校驗的話,那么鉤子函數就是對數據的內在進行校驗
鉤子函數也分為兩個一個是局部鉤子,一個是全局鉤子
局部鉤子是每次只校驗一個字段數據,而全局鉤子一次可以校驗多個字段數據
局部鉤子:
def clean_username(self):
username = self.cleaned_data.get('username')
if username == 'jason':
self.add_error('username', '用戶名jason已存在')
return username # 局部鉤子返回的是字段數據
全局鉤子:
def clean(self):
password = self.cleaned_data.get('password')
confirm_pwd = self.cleaned_data.get('confirm_pwd')
if not password == confirm_pwd:
self.add_error('confirm_pwd', '兩次密碼不一致')
return self.cleaned_data # 全局鉤子返回的是cleaned_data
min_length 最小字符
max_length 最大字符
min_value 最小值
max_value 最大值
lable 字段注釋
error_messages 錯誤提示
validators 正則校驗器
initial 默認值
給字段添加默認值
required 是否必填
正常情況下該參數默認為True,如果我們要讓某一個字段變為可不填,則將該字段的required參數改為False
widget 用來控制標簽的各項屬性
1.比如說CharField正常情況下默認的是type="text",由于是forms組件渲染的,沒地方修改,因此如果我們想修改type屬性的話就需要用到widget
具體用法:
widget=forms.widgets.PasswordInput() # type屬性改為password
2.還可以修改標簽樣式
widget=forms.widgets.PasswordInput(attr={'class': 'form-control', 'username': 'jason'})
跟多可以參考http://www.rzrgm.cn/Dominic-Ji/p/9240365.html
就是form與model模型層的結合
from django import forms
from app01 import models
class MyModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo # 選擇對哪張表做數據校驗
fields = '__all__' # 表中所有字段都校驗
labels = {
'username':'用戶名'
} # 字段的名稱
使用:
def ab_mf_func(request):
modelform_obj = MyModelForm()
if request.method == 'POST':
modelform_obj = MyModelForm(request.POST,instance=User_obj)
if modelform_obj.is_valid():
modelform_obj.save() # 將校驗過的數據保存到數據庫中
else:
print(modelform_obj.errors)
return render(request, 'modelFormPage.html', locals())
Django中間件
中間件主要用于網站訪問頻率的校驗、用戶權限的校驗等全局性的功能需求
Django中間件默認有七個,同時也支持用戶自定義中間件
Django默認的七個中間件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
自定義中間件
1.創建一個存儲自定義中間件代碼的py文件或目錄
2.參考默認中間件的代碼編寫類并繼承
3.在類中編寫五個可以自定義的方法
1.process_request
1.請求來的時候會從上往下依次經過每一個注冊過的中間件里面的該方法,如果沒有則跳過
2.如果該方法自己返回了一個HttpResponse對象,那么程序不再往后面的中間件走了,而是直接原路返回
2.process_response
1.響應走的時候是從下往上依次經過每一個注冊過的中間件里面的該方法,如果沒有則跳過
2.該方法有兩個形參request和reponse,形參response指代的是后端想要返回給前端的數據,該方法必須返回形參,可以替代
3.process_view
4.process_exception
5.process_template_response
4.自定義的中間件需在配置文件中注冊才能生效