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':'','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开头')],
            )

相关推荐