Django组件(二) Django之Form
Forms组件概述#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | forms组件 -Django提供的用语数据校验和模板渲染的组件 -在项目中创建一个py文件 -1 写一个类继承Form -2 在类中写属性,写的属性,就是要校验的字段 -3 使用:生成一个你写的类的对象myform,把要校验的数据(字典),传到对象中:MyForm(字典) -数据多?数据少?数据多可以,少不行(required控制) -4 myform.is_valid() 是True表示所有字段都通过校验 -5 myform.cleaned_data:是一个字典,所有通过校验的数据放在里面 -6 myform.errors:是一个字典,所有的错误字段的信息 -在模板中: -{{myform.name}} -{%for item in myform%} {{item.label}}:{{item}} {%endfor%} -myform.as_table/as_p/as_ul(不推荐使用) -forms组件的渲染错误信息 在模板中:< span >{{ foo.errors.0 }}</ span > -forms使用bootstrap样式 widget=widgets.EmailInput(attrs={'class':'form-control'})) -全局和局部钩子函数 AOP:面向切面编程 -局部钩子函数(再校验name) def clean_name(self): # 从cleaned_data中取出字段的值 name = self.cleaned_data.get('name') # # 校验是否以sb开头 if name.startswith('sb'): raise ValidationError('不能以sb开头') else: return name -全局钩子函数 def clean(self): pwd=self.cleaned_data.get('pwd') re_pwd=self.cleaned_data.get('re_pwd') if pwd==re_pwd: # 正确,返回self.cleaned_data return self.cleaned_data else: # 校验失败,抛异常 raise ValidationError('两次密码不一致') |
校验字段功能#
针对一个实例:注册用户讲解。
模型:models.py
class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) email=models.EmailField(
模版文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <! 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 > |
视图函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # 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#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <! 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#
1 2 3 4 5 6 7 8 9 10 11 12 | < 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#
1 2 3 4 5 6 7 8 | < form action="" method="post"> {% csrf_token %} {{ form.as_p }} < input type="submit" class="btn btn-default pull-right"> </ form > |
渲染错误信息功能#
视图#
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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()) |
模板#
1 2 3 4 5 6 7 8 9 10 11 12 | < 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 > |
组件的参数配置#
1 2 3 4 5 6 7 | class Ret(Form): name = forms.CharField(max_length=10, min_length=2, label='用户名', error_messages={'required': '该字段不能为空', 'invalid': '格式错误', 'max_length': '太长', 'min_length': '太短'}, widget=widgets.TextInput(attrs={'class':'form-control'})) pwd = forms.CharField(max_length=10, min_length=2, widget=widgets.PasswordInput(attrs={'class':'form-control'})) email = forms.EmailField(label='邮箱', error_messages={'required': '该字段不能为空', 'invalid': '格式错误'}) |
局部钩子#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from django.core.exceptions import NON_FIELD_ERRORS, ValidationError def clean_name(self): val=self.cleaned_data.get("name") ret=UserInfo.objects.filter(name=val) if not ret: return val else: raise ValidationError("该用户已注册!") def clean_tel(self): val=self.cleaned_data.get("tel") if len(val)==11: return val else: raise ValidationError("手机号格式错误") |
全局钩子#
1 2 3 4 5 6 7 8 9 10 11 12 | def clean(self): pwd=self.cleaned_data.get('pwd') r_pwd=self.cleaned_data.get('r_pwd') if pwd and r_pwd: if pwd==r_pwd: return self.cleaned_data else: raise ValidationError('两次密码不一致') else: return self.cleaned_data |
pwd_err=my_form.errors.get('__all__')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | from django.shortcuts import render,HttpResponse # Create your views here. from app01.myforms import * def reg(request): if request.method=="POST": print(request.POST) #form=UserForm({"name":"yu","email":"123@qq.com","xxxx":"alex"}) form=UserForm(request.POST) # form表单的name属性值应该与forms组件字段名称一致 print(form.is_valid()) # 返回布尔值 if form.is_valid(): print(form.cleaned_data) # {"name":"yuan","email":"123@qq.com"} else: print(form.cleaned_data) # {"email":"123@qq.com"} # print(form.errors) # {"name":[".........."]} # print(type(form.errors)) # ErrorDict # print(form.errors.get("name")) # print(type(form.errors.get("name"))) # ErrorList # print(form.errors.get("name")[0]) # 全局钩子错误 #print("error",form.errors.get("__all__")[0]) errors=form.errors.get("__all__") return render(request,"reg.html",locals()) ''' form.is_valid() :返回布尔值 form.cleaned_data :{"name":"yuan","email":"123@qq.com"} form.errors :{"name":[".........."]} ''' form=UserForm() return render(request,"reg.html",locals()) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架