Django-Form組件
Form組件
Form組件的作用:
對前段Form表單POST的數據進行格式效驗
常用參數:
-
is_valid():如果Form表單POST的數據都能通過,就會返回True,否則返回Flase
-
cleared_data: 數據效驗通過就會以字典的形式存儲在里面
-
errors:存儲錯誤字段和信息 。表面是HTML標簽類型,實際上是字典
示例:注冊頁面
views視圖函數:
from django.shortcuts import render,HttpResponse
from django import forms
# Create your views here.
class UserForm(forms.Form):
user = forms.CharField(min_length=4)
pwd = forms.CharField(min_length=4)
r_pwd = forms.CharField(min_length=4)
email = forms.EmailField(max_length=32)
tel = forms.IntegerField()
addr = forms.CharField(max_length=32)
def reg(request):
if request.method=="POST":
form=UserForm(request.POST)
if form.is_valid():
print(form.cleaned_data) # 所有干凈的字段以及對應的值
else:
print(form.cleaned_data) #
print(form.errors) # ErrorDict : {"校驗錯誤的字段":["錯誤信息",]}
# <ul class="errorlist"><li>pwd<ul class="errorlist"><li>Ensure this value has at least 4 characters (it has 3).</li></ul></li></ul>
print(type(form.errors)) # <class 'django.forms.utils.ErrorDict'>
print(type(form.errors.get("pwd"))) # ErrorList ["錯誤信息",] --> <class 'django.forms.utils.ErrorList'>
print(form.errors.get("pwd")[0]) # ErrorList ["錯誤信息",] ---> Ensure this value has at least 4 characters (it has 3).
return HttpResponse("OK")
return render(request,"reg.htm
html模板頁面
<form method="post">
{% csrf_token %}
<p>user<input type="text" name="user"></p>
<p>pwd<input type="password" name="pwd"></p>
<p>r_pwd<input type="password" name="r_pwd"></p>
<p>email<input type="email" name="email"></p>
<p> tel<input type="tel" name="tel"></p>
<p> addr<input type="text" name="addr"></p>
<input type="submit" >
模板的渲染方式一:
視圖函數頁面:
form = UserForm() # 實例化 然后傳入模板中調用
eturn render(request,"reg.html",locals())
HTML模板頁面:
{# 使用Formu組件創建輸入框 #}
<form method="post">
{% csrf_token %}
<p>user{{form.user}}</p>
<p>pwd{{form.pwd}}</p>
<p>r_pwd{{form.r_pwd}}</p>
<p>email{{form.email}}</p>
<p>tel{{form.tel}}</p>
<p>addr{{form.addr}}</p>
<input type="submit" >
</form>
模板渲染效果:

模板的渲染方式二:
直接調用UserForm實例化對象的屬性,推薦使用
<p>使用Formu組件渲染方式二 </p>
<form method="post">
{% csrf_token %}
{% for form_obj in form %}
<div>
<label for="">{{ form_obj.label }}</label>
{{ form_obj }}
</div>
{% endfor %}
<input type="submit" >
</form>
模板渲染效果:

如果想更改 input標簽前面的名字,可以在類 UserForm里設置lable屬性即可,示例:
class UserForm(forms.Form):
user = forms.CharField(min_length=4,label="用戶名")
pwd = forms.CharField(min_length=4,label="設置想要的值")
r_pwd = forms.CharField(min_length=4)
email = forms.EmailField(max_length=32)
tel = forms.IntegerField()
addr = forms.CharField(max_length=32)
渲染效果:

模板的渲染方式三:
使用UserForm對象的屬性:
1. as_p:固定樣式: 標簽屬性不可更改
<p><label for="id_user">User:</label> <input type="text" name="user" minlength="4" required="" id="id_user"></p>

2. as_ul: 固定樣式: 標簽屬性不可更改
<li><label for="id_user">User:</label> <input type="text" name="user" minlength="4" required="" id="id_user"></li>
模板渲染效果:

實現重置和顯示錯誤信息
視圖頁面:
if request.method=="POST":
form=UserForm(request.POST)
if form.is_valid():
print(form.cleaned_data) # 所有干凈的字段以及對應的值
else:
print(form.cleaned_data) #
print(form.errors) # ErrorDict : {"校驗錯誤的字段":["錯誤信息",]}
return render(request, "reg.html", locals()) # 添加個返回值,將已有數據的UserForm的對象傳入模板中
模板頁面:
<p>使用For組件渲染方式一 </p>
<form method="post">
{% csrf_token %}
<p>user{{form.user}}</p><span>{{ form.user.errors.0 }}</span>
<p>pwd{{form.pwd}}</p><span>{{ form.pwd.errors.0 }}</span>
<p>r_pwd{{form.r_pwd}}</p><span>{{ form.r_pwd.errors.0 }}</span>
<p>email{{form.email}}</p><span>{{ form.email.errors.0 }}</span>
<p>tel{{form.tel}}</p><span>{{ form.tel.errors.0 }}</span>
<p>addr{{form.addr}}</p><span>{{ form.addr.errors.0 }}</span>
<input type="submit" >
</form>
給Form組件設置標簽類型,增加標簽屬性,自定義錯誤信息
只需在類“UserForm”中定義相關屬性即可:
1.widget=forms."標簽類型"(attr={"屬性":"值",})
2.error_messages={"requied":"不能為空屬性值","invalid":"無效的屬性值",}
示例如下:
class UserForm(forms.Form):
user = forms.CharField(min_length=4,label="用戶名",error_messages={"requied":"該字段不能為空","invalid":"無效的",},widget=forms.TextInput(attrs={"class":"form-control"}))
pwd = forms.CharField(min_length=4,label="密碼",widget=forms.PasswordInput(attrs={"class":"form-control"}))
r_pwd = forms.CharField(min_length=4,label="確認密碼",widget=forms.PasswordInput(attrs={"class":"form-control"}))
email = forms.EmailField(max_length=32,label="郵箱",widget=forms.PasswordInput(attrs={"class":"form-control"}))
tel = forms.IntegerField(label="手機號",widget=forms.TextInput(attrs={"class":"form-control"}))
addr = forms.CharField(max_length=32,label="地址",widget=forms.TextInput(attrs={"class":"form-control"}))
效果圖:

局部鉤子
對Form表單的每個字段進行逐個檢測
示例:對用戶名,手機號進行檢測判斷
# 局部鉤子
def clean_user(self):
'''
對輸入的用戶名判斷是否已存在
:return:
'''
print(self.cleaned_data)
# 獲取效驗過字段的clear_data中的數據
user = self.cleaned_data["user"]
# 判斷用戶名是否存在
ret = UserInfo.objects.filter(user=user).first()
# 對數據庫查詢結果進行判斷
if not ret: # 不存在即為False,返回對應值
return self.user
else: # 存在報錯
raise ValidationError("該用戶已存在")
def clean_tel(self):
'''
對手機號進行格式判斷
:return:
'''
tel = self.cleaned_data["tel"]
print(tel)
# 對手機號長度進行判斷
if len(tel) == 11:
return self.tel
else:
raise ValidationError("手機號格式錯誤")
效果圖:

全局鉤子
對Form表單的所有字段進行全局檢測
示例:對兩次密碼進行檢測判斷
HTML模板:
<p>使用For組件渲染方式一 </p>
<form method="post">
{% csrf_token %}
<p>user{{form.user}}</p><span class="errors pull-right">{{ form.user.errors.0 }}</span>
<p>pwd{{form.pwd}}</p><span class="errors pull-right">{{ form.pwd.errors.0 }}</span>
<p>r_pwd{{form.r_pwd}}</p><span class="errors pull-right">{{ form.r_pwd.errors.0 }}</span><span class="errors pull-right">{{ errors.0 }}</span>
<p>email{{form.email}}</p><span class="errors pull-right">{{ form.email.errors.0 }}</span>
<p>tel{{form.tel}}</p><span class="errors pull-right">{{ form.tel.errors.0 }}</span>
<p>addr{{form.addr}}</p><span class="errors pull-right">{{ form.addr.errors.0 }}</span>
<input type="submit" >
</form>
視圖函數:
def reg(request):
print(request.POST)
print(type(request.POST.get("tel")))
if request.method=="POST":
form=UserForm(request.POST)
if form.is_valid():
print(form.cleaned_data) # 所有干凈的字段以及對應的值
else:
print(form.cleaned_data) #
print(form.errors) # ErrorDict : {"校驗錯誤的字段":["錯誤信息",]}
# 全局鉤子錯誤
errors = form.errors.get("__all__")
print(errors[0]) # 兩次密碼不一致
效果圖:


浙公網安備 33010602011771號