forms组件

forms组件

【一】介绍

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

【二】基本使用

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()

【三】校验数据

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

【1】校验数据是否合法

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

【2】查看所有校验通过的数据

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

# {'username': 'qcc', '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>

【四】渲染到前端

  • 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>
<body>
{{ form_test.as_ul }}
</body>
<body>
{{ form_test.as_table }}
</body>

【2】第二种渲染方式

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

【3】第三种渲染方式

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

【五】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=6, min_length=3, label='用户名',
                               error_messages={
                                   'required': '用户名不能为空',
                                   'max_length': '用户名长度不能超过6个字符',
                                   'min_length': '用户名长度不能少于3个字符'
                               })
    password = forms.CharField(max_length=6, min_length=3, label='密码',
                               error_messages={
                                   'required': '密码不能为空',
                                   'max_length': '密码长度不能超过6个字符',
                                   'min_length': '密码长度不能少于3个字符'
                               })
    email = forms.EmailField(
        error_messages={
            'required': '邮箱不能为空',
            'invalid': '邮箱格式不正确'
        }
    )

【六】钩子函数hook

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

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

  • 有两类钩子

    • 局部钩子
    • 全局钩子

【1】局部钩子

  • 局部钩子当需要给单个字段增加校验规则的时候使用
class MyForm(forms.Form):
    username = forms.CharField(max_length=6, 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=6, min_length=3, label='密码',
                               error_messages={
                                   'required': '密码不能为空',
                                   'max_length': '密码长度不能超过6个字符',
                                   'min_length': '密码长度不能少于3个字符'
                               })
    confirm_password = forms.CharField(max_length=6, min_length=3, label='确认密码',
                                       error_messages={
                                           'required': '确认密码不能为空',
                                           'max_length': '确认密码长度不能超过6个字符',
                                           '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

【七】forms组件其他参数及补充知识点

【1】label 命名

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

【2】error_messages 自定义报错信息

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

【3】 initial 默认值

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

【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':'qcc'})

【6】 validators 正则校验

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

【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()
)
posted @ 2024-04-22 16:39  蓝幻ﹺ  阅读(4)  评论(0编辑  收藏  举报