Django組件—forms組件
阿新 • • 發佈:2018-07-07
else 數字 ror sub app 字段 bubuko 源碼 error
forms組件:
校驗字段功能:
針對一個實例:註冊用戶。
模型:models.py
class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) email=models.EmailField() tel=models.CharField(max_length=32)
模板:register.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <div> <label for="user">用戶名</label> <p><input type="text" name="name" id="name"></p></div> <div> <label for="pwd">密碼</label> <p><input type="password" name="pwd" id="pwd"></p> </div> <div> <label for="r_pwd">確認密碼</label> <p><input type="password" name="r_pwd" id="r_pwd"></p> </div> <div> <label for="email">郵箱</label> <p><input type="text" name="email" id="email"></p> </div> <input type="submit"> </form> </body> </html>
視圖函數:register
# forms組件 from django.forms import widgets wid_01=widgets.TextInput(attrs={"class":"form-control"}) wid_02=widgets.PasswordInput(attrs={"class":"form-control"}) class UserForm(forms.Form): name=forms.CharField(max_length=32, widget=wid_01 ) pwd=forms.CharField(max_length=32,widget=wid_02) r_pwd=forms.CharField(max_length=32,widget=wid_02) email=forms.EmailField(widget=wid_01) tel=forms.CharField(max_length=32,widget=wid_01) def register(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 : {"校驗錯誤的字段":["錯誤信息",]} print(form.errors.get("name")) # ErrorList ["錯誤信息",] return HttpResponse("OK") form=UserForm() return render(request,"register.html",locals())
渲染標簽功能:
渲染方式1:
<h3>渲染方式一</h3> <form action="" method="post" novalidate> {% csrf_token %} {{ form.as_p }} <input type="submit"> </form> </body> </html>
直接將form對象傳入,然後通過.as_p方法可以將每一個字段都以input標簽建成。
input標簽前的名字,默認是字段名,若想顯示為中文,則需要在字段屬性中,添加lable.如:
class UserForm(forms.Form): name = forms.CharField(min_length=4,label="姓名") pwd = forms.CharField(max_length=16,label="密碼") age = forms.IntegerField(label="年齡") tel = forms.CharField(label="電話")
渲染方式2:
<h3>渲染方式二</h3> <form action="" method="post" novalidate> {% csrf_token %} <div> <label for="">用戶名</label> {{ form.name }} {# 一定要是form.字段名#} </div> <div> <label for="">密碼</label> {{ form.pwd }} </div> <div> <label for="">年齡</label> {{ form.age }} </div> <div> <label for="">電話</label> {{ form.tel }} </div> <input type="submit"> </form>
渲染方式三:form表單外是加了一些bootstrap樣式
<div class="container"> <div class="row"> <div class="col-md-8"> <form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="">{{ field.label }}</label> {{ field }} </div> {% endfor %} <input type="submit"> </form> </div> </div> </div>
顯示錯誤與重置輸入信息功能:
視圖:
from django.shortcuts import render,HttpResponse,reverse,redirect # Create your views here. from app01.form import UserForm def register(request): if request.method == "POST": form = UserForm(request.POST) if form.is_valid(): print("######success#######") print(form.cleaned_data) print(form.errors) print(type(form.errors)) return HttpResponse("添加成功") else: print("##########failed##########") print(form.cleaned_data) # 正確的情況下會顯示的字典。 print(form.errors) # 是一個字典。 print(form.errors.get("name")) # 拿到的是ul裏面包著錯誤信息 print(form.errors.get("name")[0]) # 拿到的是錯誤信息 return render(request,"register.html",locals()) form = UserForm() return render(request,"register.html",locals())
模板:
<div class="container"> <div class="row"> <div class="col-md-8 col-lg-offset-2"> <form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="">{{ field.label }}</label> {{ field }} <span class="errors pull-left">{{ field.errors.0 }}</span> </div> {% endfor %} <div class="form-group"> <input type="submit" class=" btn btn-success btn-sm"> </div> </form> </div> </div> </div>
局部鉤子與全局鉤子:
模板:
from django import forms from django.core.exceptions import ValidationError,NON_FIELD_ERRORS from django.forms import widgets # widgets可以設置css樣式 class UserForm(forms.Form): name = forms.CharField(min_length=4,label="姓名",widget=widgets.TextInput(attrs=({"class":"form-control"}))) pwd = forms.CharField(max_length=16,label="密碼",widget=widgets.PasswordInput(attrs=({"class":"form-control"}))) age = forms.IntegerField(label="年齡",widget=widgets.TextInput(attrs=({"class":"form-control"}))) tel = forms.CharField(label="電話",widget=widgets.TextInput(attrs=({"class":"form-control"}))) def clean_name(self): # 函數名格式必須是 clean_字段名。源碼規定。 val = self.cleaned_data.get("name") # 從正確字典中獲取name數據。 if not val.isdigit(): # 如果不是純數字。 return val # 返回源數據。 else: raise ValidationError(‘用戶名不能是純數字‘) # 否則就拋出錯誤。 def clean_pwd(self): val = self.cleaned_data.get("pwd") if len(val)>6: return val else: raise ValidationError("密碼不足6位") def clean_age(self): val = self.cleaned_data.get("age") if int(val)>=18: return val else: raise ValidationError(‘未成年不得入內‘) def clean_tel(self): val = self.cleaned_data.get("tel") if int(val)==11: return val else: raise ValidationError("手機號不合法")
視圖:
<div class="container"> <div class="row"> <div class="col-md-8 col-lg-offset-2"> <form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="">{{ field.label }}</label> {{ field }} <span class="errors pull-left">{{ field.errors.0 }}</span> </div> {% endfor %} <div class="form-group"> <input type="submit" class=" btn btn-success btn-sm"> </div> </form> </div> </div> </div>
Django組件—forms組件