首页 > 其他分享 >forms组件

forms组件

时间:2024-03-11 21:33:46浏览次数:21  
标签:username form label forms length 组件 password

forms组件

(1)介绍

  • Forms组件是用来处理用户提交的数据,并将其转换成Python可处理的数据类型。Forms组件提供了一种简单的方式来定义表单的结构以及验证用户输入的数据。通过使用Forms组件,你可以有效地处理用户输入的数据,包括验证、转换以及显示错误信息。

(2)基本使用

from django import forms

class MyForm(forms.Form):
    username = forms.CharField(max_length=8,min_length=3)
    password = forms.CharField(max_length=8,min_length=3)
    email = forms.EmailField()

(3)校验数据

  • 先实例化一个对象
form_obj = MyForm()
  • 将待校验的数据组织成字典的形式传入
form_obj = MyForm({'username':'heart','password':'123','email':'123'})

(1)校验数据是否合法

  • .is_valid() 校验数据是否合法
  • 只有在所有的数据全部合法的情况下才会返回True
form_obj.is_valid() # False 因为邮箱的格式不正确

(2)查看所有校验通过的数据

  • cleaned_data 查看所有校验通过的数据
  • 必须配合 .is_valid() 一起使用,否则会报错
form_obj.cleaned_data

# {'username': 'heart', 'password': '123'}

(3)查看未校验通过的数据

  • errors查看所有不符合校验规则以及不符合的原因
form_obj.errors

# <ul class="errorlist"><li>email<ul class="errorlist"><li>Enter a valid email address.</li></ul></li></ul>

(4)渲染到前端

  • forms组件只会自动帮你渲染获取用户输入的标签
from django import forms

class MyForm(forms.Form):
    username = forms.CharField(max_length=8,min_length=3,label='用户名')
    password = forms.CharField(max_length=8,min_length=3)
    email = forms.EmailField()
    
def index(request):
    form_test = MyForm()
    return render(request, 'index.html',locals())

(1)第一种渲染方式

  • 实例化对象.as_p as_ul as_table
  • 代码书写极少 封装程度太高 不利于后期扩展 一般只在本地测试使用
<body>
{{ form_test.as_p }}
</body>

image

<body>
{{ form_test.as_ul }}
</body>

image

<body>
{{ form_test.as_table }}
</body>

image

(2)第二种渲染方式

  • 可扩展性很强 但是书写的代码太多
<body>
{{ form_test.username.label }} {{ form_test.username }}
</body>

image

(3)第三种渲染方式(推荐使用)

  • 代码书写简单 并且扩展性也高
<body>
{% for form in form_test %}
	<p>{{ form.label }}:{{ form }}</p>
{% endfor %}
</body>

image

(5)forms组件展示错误信息

  • 让浏览器不校验novalidate
<form action="" method="post" novalidate>
def index(request):
    form_test = MyForm()
    if request.method =='POST':
        form_test = MyForm(request.POST)
        if form_test.is_valid():
            return HttpResponse('ok')
    return render(request, 'index.html',locals())
<form action="" method="post" novalidate>
{% for form in form_test %}
    <p>
        {{ form.label }}:{{ form }}
        <span style="color: red"> {{ form.errors.0 }}</span>
    </p>
{% endfor %}
<input type="submit" class="btn btn-info">
</form>
  • 必备的条件:get请求和post传给html页面对象变量名必须一样
  • forms组件当你的数据不合法的情况下,会保存上一次的数据,可以基于之前的结果进行修改

(1)自定制错误信息

  • required
    • 如果输入为空 提示的信息
  • invalid
    • 邮箱输入错误提示的信息
class MyForm(forms.Form):
    username = forms.CharField(max_length=8, min_length=3, label='用户名',
                               error_messages={
                                   'required': '用户名不能为空',
                                   'max_length': '用户名长度不能超过8个字符',
                                   'min_length': '用户名长度不能少于3个字符'
                               })
    password = forms.CharField(max_length=8, min_length=3, label='密码',
                               error_messages={
                                   'required': '密码不能为空',
                                   'max_length': '密码长度不能超过8个字符',
                                   'min_length': '密码长度不能少于3个字符'
                               })
    email = forms.EmailField(
        error_messages={
            'required': '邮箱不能为空',
            'invalid': '邮箱格式不正确'
        }
    )

(6)钩子函数hook

  • 在特定的节点自动触发完成响应操作

  • 钩子函数在forms组件中就类似于第二道关卡,能够自定义校验规则

  • 有两类钩子

    • 局部钩子
    • 全局钩子

(1)局部钩子

  • 局部钩子当需要给单个字段增加校验规则的时候使用
class MyForm(forms.Form):
    username = forms.CharField(max_length=8, min_length=3, label='用户名',
                               error_messages={
                                   'required': '用户名不能为空',
                                   'max_length': '用户名长度不能超过8个字符',
                                   'min_length': '用户名长度不能少于3个字符'
                               })
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if '666' in username:
            # 提示前端展示错误信息
            # 前面放的是需要给展示的字段名,后面放的是错误信息
            self.add_error('username', '用户名中不能包含666')
        return username

(2)全局钩子

  • 全局钩子当需要给多个字段增加校验规则的时候使用
class MyForm(forms.Form):
    password = forms.CharField(max_length=8, min_length=3, label='密码',
                               error_messages={
                                   'required': '密码不能为空',
                                   'max_length': '密码长度不能超过8个字符',
                                   'min_length': '密码长度不能少于3个字符'
                               })
    confirm_password = forms.CharField(max_length=8, min_length=3, label='确认密码',
                                       error_messages={
                                           'required': '确认密码不能为空',
                                           'max_length': '确认密码长度不能超过8个字符',
                                           'min_length': '确认密码长度不能少于3个字符'
                                       })
    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if password != confirm_password:
            self.add_error('confirm_password', '两次密码不一致')
        # 将钩子函数钩出来的数据再放回去
        return self.cleaned_data

(7)forms组件其他参数及补充知识点

(1)label 命名

name = forms.CharField(label='昵称')

(2)error_messages 自定义报错信息

email = forms.EmailField(
    error_messages={
        'required': '邮箱不能为空',
        'invalid': '邮箱格式不正确'
    }
)

(3)initial 默认值

name = forms.CharField(initial='heart')

(4)required 控制是否必填

name = forms.CharField(required=False)

(5)widget 控制type类型

widget=forms.widgets.TextInput()
widget=forms.widgets.PasswordInput()
widget=forms.widgets.EmailInput()

# widget加样式(多个属性值的话 直接空格隔开)
widget=forms.widgets.TextInput(attrs={'class':'form-control c1 c2','username':'heart'})

(6)validators 正则校验

validators=[
    RegexValidator(r'^[0-9]+$','请输入数字'),
    RegexValidator(r'^156[0-9]+$','数字必须以156开头'),
]

(7)radio 单选

gender = forms.ChoiceField(
    choices=((1, '男'), (2, '女'), (3, '保密')),
    label='性别',
    initial=3,
    widget=forms.widgets.RadioSelect()
)

(8)select 选择下拉框

hobby = forms.ChoiceField(
    choices=((1, '篮球'), (2, '足球'), (3, '乒乓球')),
    label='爱好',
    initial=3,
    widget=forms.widgets.Select()
)

(9)select 多选下拉框

hobby = forms.MultipleChoiceField(
    choices=((1, "篮球"), (2, "足球"), (3, "乒乓球"), ),
    label="爱好",
    initial=[1, 3],
    widget=forms.widgets.SelectMultiple()
)

(10)checkbox 单选框

keep = forms.ChoiceField(
    label="是否记住密码",
    initial="checked",
    widget=forms.widgets.CheckboxInput()
)

(11)checkbox 多选框

hobby = forms.MultipleChoiceField(
    choices=((1, "篮球"), (2, "足球"), (3, "乒乓球"),),
    label="爱好",
    initial=[1, 3],
    widget=forms.widgets.CheckboxSelectMultiple()
)

标签:username,form,label,forms,length,组件,password
From: https://www.cnblogs.com/ssrheart/p/18067118

相关文章

  • vue3 父子组件间通讯
    1、父组件向子组件传值父组件<fitSteps:stepActive="stepActive"><div>插槽信息</div>      <van-buttontype="primary"@click="FatherClick">下一步</van-button></fitSteps>conststepActive=ref......
  • DevExpress Winforms 等待界面代码 SplashScreen
    更新记录点击查看2024年3月11日发布。2023年6月12日初始化。代码//等待界面显示SplashScreenManager.ShowSkinSplashScreen(title:"正在创建新工程",subtitle:"文件准备中,请稍等~",//footer:"DeveloperExpressInc."+Environment.NewLine+"All......
  • 组件的定义
    定义组件: 1.函数式定义:<divid="test"></div><scripttype="text/babel">//创建函数式组件functionDemo(){return<h2>定义的简单组件</h2>}ReactDom.render(<Demo/>,document.getElementByI......
  • Vue组件库的选择与实现 - ViewDesign
    随着Web应用的不断进化和发展,前端开发的需求也在日益增加。在这样的背景下,Vue框架以及各种Vue组件库应运而生。本文将探讨如何选择一个高质量的Vue组件库,并通过使用ViewDesign库阐述如何实现高效、优雅的前端架构。前端架构的重要性前端架构的设计对于整个项目的成功至关重要。......
  • 2024新版Axure RP大数据可视化大屏模板68套及通用组件+PSD文件
    AxureRP数据可视化大屏模板及通用组件库2024新版重新制作了这套新的数据可视化大屏模板及通用组件库V2版。新版本相比于V1版内容更加丰富和全面,但依然秉承“敏捷易用”的制作理念,这套作品也同样延续着我们对细节的完美追求,整个设计制作过程我们同样投入了大量的精力。作品制作前......
  • DependencyCheck开源的软件组件漏洞检测工具
    DependencyCheck是一个开源的软件组件漏洞检测工具,用于帮助开发人员和安全团队发现项目中使用的第三方库中的已知漏洞。它扫描应用程序的依赖关系,包括第三方库、框架和其他组件,然后与漏洞数据库进行比较,以识别是否存在已公开披露的安全漏洞。1.主要特点包括:1.**自动化扫描:**De......
  • Vue — 组件通信
    一、父传子<!--1.父组件:给子组件用添加属性的方式来传值--><Son:msg="msg":arr="arr"></Son>//2.子组件:子组件通过props来接收props:['msg','arr']关于prop1.什么是prop(1)定义:组件上定义的一些自定义属性(2)作用:向子组件传递数据(3)特点:可以传任意......
  • vue父子组件传参后,子组件重新初始化
    首先回顾一下父子组件生命周期的执行顺序:加载渲染过程:父beforeCreate ---> 父created ---> 父beforeMount ---> 子beforeCreate ---> 子created ---> 子beforeMount ---> 子mounted ---> 父mounted 子组件更新过程:父beforeUpdate ---> 子beforeUpdate--->......
  • uni-forms 和 uni-data-select 嵌套使用设定必填但初始化时不校验
    使用 uni-forms-item和 uni-data-select嵌套时,首先要注意的是:name=[]属性必须使用动态绑定,而且数组中的字符串必须和v-model的属性完全相同,如v-model="formatStationInfo.requiredSelect[index].curValue":name="['requiredSelect',index,'curValue']" :......
  • Unity3D中刚体、碰撞组件、物理组件的区别详解
    Unity3D提供了丰富的功能和组件,其中包括刚体、碰撞组件和物理组件。这些组件在游戏开发中起着非常重要的作用,能够让游戏世界更加真实和有趣。本文将详细介绍这三种组件的区别以及如何在Unity3D中实现它们。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也......