form组件

form组件前戏

"""
练习
	页面上获取用户输入的用户名和密码
	然后判断用户名和密码是否符合一些条件 如果不符合则返回相应的提示信息
"""
自定义数据校验功能 主要步骤
1.搭建前端页面				标签渲染
2.校验数据是否合法			   数据校验
3.返回相应的提示信息			  提示信息
# 上述的三个步骤form组件都可以自动实现

form组件基本定义

# 与模型层类的定义相似
class MyForm(forms.Form):
    # username字段最短三位最长八位
    username = forms.CharField(min_length=3, max_length=8)
    # password字段最短三位最长八位
    password = forms.CharField(min_length=3, max_length=8)
    # email字段必须符合邮箱格式
    email = forms.EmailField()

form组件数据校验功能

# 1.传入待校验的数据
obj = views.MyForm({'username':'jason',
                    'password':'123',
                    'email':'123@qq.com'
                   })
# 2.判断所有的数据是否合规
obj.is_valid()  # 结果是布尔值(只有所有的数据都合规才返回True)
# 3.如何查看符合条件校验的数据
obj.cleaned_data  # 字典(所有通过校验的数据)
# 4.如何查看不符合条件检验的数据和错误的原因
obj.errors
"""
1.在传递数据的时候 如果多传了额外字段 没有关系   form不校验
2.form组件内部定义的字段数据 默认都是必填的
	可以通过修改参数required=False来控制是否必填
"""

form组件渲染标签

def my_form(request):
    # 1.直接生成一个不传参数的form对象
    obj = MyForm()
    return render(request,'my_form.html',locals())
"""
自动渲染的标签文本名称默认采用字段名首字母大写的形式
	可以通过label参数自定义名称
form只渲染获取用户数据的标签 不渲染提交按钮 需要我们自己编写
"""

# 渲染标签的方式1
	{{ obj.as_p }}  # 封装程度太高 扩展不易 通常用于本地测试
    {{ obj.as_ul }}
    {{ obj.as_table }}
# 渲染标签的方式2
    <label for="{{ obj.username.id_for_label }}">{{ obj.username.label }}</label>
    {{ obj.username }}  # 扩展性高 但是书写麻烦
# 渲染标签的方式3
	{% for foo in obj %}
        <p>
            <label for="{{ foo.id_for_label }}">{{ foo.label }}</label>
            {{ foo }}  # 融合了方式1和方式2的优势(推荐使用)
        </p>
    {% endfor %}

form组件提示信息

# 如何取消前端自动校验
	<form ... novalidate></form>
 
# 前端提前配置好
	{{ foo.errors.0 }}
 
# 后端自定义提示信息
	error_messages={
        'min_length': '用户名最少3位',
        'max_length': '用户名最大8位',
        'required': '用户名不能为空',
        'invalid':'邮箱格式不正确'
    }

数据校验进阶

# 正则校验
from django.core.validators import RegexValidator
class MyForm(Form):
    user = fields.CharField(
        validators=[
            RegexValidator(r'^[0-9]+$', '请输入数字'), 			RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
    )
    
# 钩子函数
# 钩子函数(基本校验规则完毕之后 产生了cleaned_data数据后才会执行钩子函数)
# 局部钩子(单个字段校验):校验用户名是否已存在
def clean_username(self):
    # 获取用户名数据
    username = self.cleaned_data.get('username')
    # 校验用户名是否已存在
    if username == 'jason':
        # 添加用户名提示信息
        self.add_error('username', '用户名已存在')
        return username

# 全局钩子(多个字段校验):校验密码与确认密码是否一致
def clean(self):
    # 获取密码
    password = self.cleaned_data.get('password')
    # 获取确认密码
    confirm_password = self.cleaned_data.get('confirm_password')
    # 比对密码是否一致
    if not password == confirm_password:
       # 添加提示信息
       self.add_error('confirm_password', '两次密码不一致')
       return self.cleaned_data

form组件补充

# 参数部分
	label			字段名称
    required		是否必填
    initial			默认值
    error_messages  自定义错误信息
    widget=forms.widgets.PasswordInput()
    	既可以修改input框的type类型
        还可以操作标签的属性

form组件源码探索

"""阅读源码是提升编程思维的最佳方式!!!"""
# 突破口在
	obj.is_valid()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值