zoukankan      html  css  js  c++  java
  • Django之Form组件

    Django之Form组件

    一、Form组件介绍

    Form组件主要的功能如下:

    • 生成前端页面能用的HTML标签(渲染页面)
    • 对用户提交的数据进行校验(校验数据)
    • 把数据的校验结果展示到前端页面(展示错误信息)
    • 输入框保留用户上次输入的数据(保留数据)

    二、Form组件的使用

    ​ 在Django项目中通常情况下我们会在需要使用Form组件的app下新建一forms.py文件,然后在该文件下书写内容.

    示例:

    # app下的forms.py
    from django import forms
    
    # 自定义一个类继承forms.Form
    class RegisterForm(forms.Form):
        username = forms.CharField(min_length=3, max_length=11)
        password = forms.CharField(min_length=6, max_length=11)   
    

    校验数据:

    # Python console
    
    from app01 import views
    
    # 1.给自定义的类传一个字典
    obj=views.MyRegForm({'username':'jason','password':'12','email':'123'})
    
    # 2.判断数据是否全部合法
    obj.is_valid()  # 只有数据全部符合要求才会是True
    Out[4]: False
        
    # 3.查看符合校验规则的数据
    obj.cleaned_data
    Out[5]: {'username': 'jason'}
        
    # 4.查看不符合条件的数据以及不符合的原因是什么
    obj.errors
    Out[6]: {
    'password': ['Ensure this value has at least 3 characters (it has 2).'],
    'email': ['Enter a valid email address.']
    }
                
     # 5.校验数据的时候 默认情况下类里面所有的字段都必须传值
    obj = views.MyRegForm({'username':'jason','password':'123'})
    obj.is_valid()
    Out[12]: False
    obj.errors
    Out[13]: {'email': ['This field is required.']}
        
    # 6.默认情况下可以多传 但是绝对不能少传
    obj=views.MyRegForm({'username':'jason','password':'1233','email':'123@qq.com','xxx':'ooo'})
    obj.is_valid()
    Out[15]: True
    

    渲染页面:

    # forms组件指挥帮你渲染获取用户输入(输入,选择,下拉框...)的标签,提交按钮需要自己写
    
    <p>三种渲染前端页面的方式</p>
    <p>第一种渲染前端页面的方式:封装程度太高了 标签样式及参数不方便调整 可扩展性差(不推荐使用)
    {{ form_obj.as_p }}
    {{ form_obj.as_ul }}
    </p>
    
    <p>第二种渲染页面的方式:扩展性较高 不足之处在于 需要你手写的代码量比较多(不推荐使用)</p>
    <p>
    	{{ form_obj.username.label }}{{ form_obj.username }}
    </p>
    <p>
    	{{ form_obj.password.label }}{{ form_obj.password }}
    </p>
    <p>
    	{{ form_obj.email.label }}{{ form_obj.email }}
    </p>
    
    <p>第三种渲染前端页面的方式:代码量和扩展性都很高(推荐使用)</p>
    {% for foo in form_obj %}
    <p>{{ foo.label }}{{ foo }}</p>
    {% endfor %}
    			
    如何展示错误信息
    如何取消前端帮我们做的校验 form表单中添加一个参数即可
    展示错误信息   用对象点errors.0
    <form action="" method="post" novalidate>
    	{% for foo in form_obj %}
    	<p>
    		{{ foo.label }}:{{ foo }}
    		<span style="color: red">{{ foo.errors.0 }}</span>
    	</p>
    	{% endfor %}
    	<input type="submit">
    </form>
    
    

    自定义错误信息:

    # app下forms.py
    
    class RegisterForm(forms.Form):
        username = forms.CharField(min_length=3, max_length=11, 									   lable='用户名',
                                   error_messages={
                                       'min_length': '用户名不能少于三位',
                                       'required': '用户名不能为空'
                                   }
                                  )
        email = forms.EmailField(lable='邮箱', error_messages={
            							'required': '邮箱不能为空',
            							'invalid': '邮箱格式不正确',
        							}) 
    

    Form组件钩子函数:

    ​ 当你针对某些字段,还需要做一些额外的校验(eg:验证用户名是否含有非法字符)的时候,就需要用到钩子函数.

    • 局部钩子:针对单个字段的校验,使用局部钩子(eg:验证手机号是否合法)
    • 全局钩子:针对多个字段的校验,使用全局钩子(eg:验证注册时两次密码是否一致)
    # app下forms.py
    
    class RegisterForm(forms.Form):
        username = ...
        password = ...
        re_password = ...
        
    # 局部钩子:验证用户名中是否含有傻逼字段
    def clean_username(self):  # 固定写法clean_字段名
    	username = self.cleaned_data.get('username')
    	if '傻逼' in username:
            # 给username字段添加错误信息
    		self.add_error('username', '用户名不合法')
    	return username
         
    # 全局钩子:验证两次密码是否一致
    def clean(self):  # 固定写法clean
    	password = self.cleaned_data.get('password')
        re_password = self.cleaned_data.get('re_password')
        if password != re_password:
            self.add_error('re_password', '两次密码不一致')
    	return self.cleaned_data
    

    修改input框的type属性值

    # app下forms.py
    from django import forms
    
    class RegisterForm(forms.Form):
        username = froms.CharField(widget=forms.widgets.TextInput())
        password = froms.CharField(widget=forms.widgets.PasswordInput())
        re_password = ...
    

    为input框添加类属性

    # app下forms.py
    from django import forms
    
    class RegisterForm(forms.Form):
        username = froms.CharField(widget=forms.widgets.TextInput(
        							attrs={
                                        'class': 'form-control'
                                    }								
       								 ))
        password = ...
        re_password = ...
    

    forms字段还支持正则校验

    # app下forms.py
    from django import forms
    from django.forms import Form
    from django.core.validators import RegexValidator
             
    class MyForm(Form):
    	user = forms.CharField(
            validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), 				RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
                )
                
    
  • 相关阅读:
    Jira 8.5.1 安装教程
    Postgres 10.11安装教程
    SonarQube 7.7 安装教程
    Apollo基于K8S的部署以及接入
    Nexus 安装教程
    Drone 安装教程
    Harbor 安装教程
    Gitlab 11.9.1 高可用教程
    Gitlab 11.9.1 安装教程
    大明的FAQ
  • 原文地址:https://www.cnblogs.com/17vv/p/11761536.html
Copyright © 2011-2022 走看看