13.2.8 组件
一、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 widgetswid_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
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><!-- 最新版本的 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>注冊頁面</h3> <div class="container"><div class="row"><div class="col-md-6 col-lg-offset-3"><form action="" method="post">{% csrf_token %}<div><label for="">用戶名</label>{{ form.name }}</div><div><label for="">密碼</label>{{ form.pwd }}</div><div><label for="">確認密碼</label>{{ form.r_pwd }}</div><div><label for=""> 郵箱</label>{{ form.email }}</div><input type="submit" class="btn btn-default pull-right"></form></div></div> </div> </body> </html>2
<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-default pull-right"> </form>3
<form action="" method="post">{% csrf_token %}{{ form.as_p }}<input type="submit" class="btn btn-default pull-right"></form>三、顯示錯誤與重置輸入信息功能
視圖
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 render(request,"register.html",locals())form=UserForm()return render(request,"register.html",locals())模板
<form action="" method="post" novalidate>{% csrf_token %}{% for field in form %}<div><label for="">{{ field.label }}</label>{{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span></div>{% endfor %}<input type="submit" class="btn btn-default"></form>四、局部鉤子與全局鉤子
模板
# forms組件 from django.forms import widgetswid_01=widgets.TextInput(attrs={"class":"form-control"}) wid_02=widgets.PasswordInput(attrs={"class":"form-control"})from django.core.exceptions import ValidationErrorclass 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 clean_name(self):val=self.cleaned_data.get("name")if not val.isdigit():return valelse:raise ValidationError("用戶名不能是純數字!")# 全局鉤子def clean(self):pwd=self.cleaned_data.get("pwd")r_pwd=self.cleaned_data.get("r_pwd")if pwd==r_pwd:return self.cleaned_dataelse:raise ValidationError('兩次密碼不一致!')def register(request):if request.method=="POST":form=UserForm(request.POST)if form.is_valid():print(form.cleaned_data) # 所有干凈的字段以及對應的值else:clean_error=form.errors.get("__all__")return render(request,"register.html",locals())form=UserForm()return render(request,"register.html",locals())視圖
<form action="" method="post" novalidate>{% csrf_token %}{% for field in form %}<div><label for="">{{ field.label }}</label>{{ field }}<span class="pull-right" style="color: red">{% if field.label == 'R pwd' %}<span>{{ clean_error.0 }}</span>{% endif %}{{ field.errors.0 }}</span></div>{% endfor %}<input type="submit" class="btn btn-default"> </form>總結
- 上一篇: 13.2.10 Ajax操作
- 下一篇: 13.2.7 中间件