Django Forms组件

Posted 抽烟喝酒的好孩纸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Forms组件相关的知识,希望对你有一定的参考价值。

forms介绍

我们之前在html页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息。

forms组件可以一条龙服务 帮你完成了三件事情:
1.渲染标签
2.校验数据
3.展示信息

forms组件的导入:

from django import forms

forms组件校验数据

is_valid():判断数据是否合法(只有全部合法结果才为True)

cleaned_data:查看所有合法的数据,返回的数据类型为dict

error:查看所有不合法的数据及原因

数据校验的实例:

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


# 类加括号 传入字典即可
	form_obj = views.MyForm({\'username\':\'abc\',\'password\':\'123\',\'email\':\'嘿嘿嘿\'})

	form_obj.is_valid()
	# False

	form_obj.cleaned_data
	# {\'username\': \'abc\', \'password\': 123}
    
	form_obj.errors
	# {\'email\': [\'Enter a valid email address.\']}

ps:校验数据可以多传,但不能少传

forms组件渲染标签

需要先生成一个对象,然后将该对象传递给html页面

def login(request):
    form_obj = MyForm()  # 先生成一个对象,对象必须是MyForm()
    return render(request,\'login.html\',locals())

forms组件渲染标签可以大致分为三种方法:

  1. 方法一

简单粗暴 一次性渲染label文本和input框

{{ form_obj.as_p }}

优点:速度快
缺点:封装程度高 不便于扩展

  1. 方法二

一步步需要自己书写字段对象

{{ form_obj.username.label }}  # 控制渲染的label标签
{{ form_obj.username }}  # 控制渲染的input标签
{{ form_obj.password.label }}
{{ from_obj.password }}
......

优点:字段之间相互解耦
缺点:字段多的时候书写麻烦

  1. 方法三

for循环依次获取每个字段对象

{% for form in form_obj %}
<p>
{{ form.label }}:{{ form }}
</p>
{% endfor %}

可以动态控制数据标签,推荐使用

ps:forms组件无法渲染提交按钮和form标签,它只能渲染label和input标签,其余内容需要自己编写。

forms组件展示提示信息

使用forms组件渲染的标签之后再获取用户数据的时候,浏览器自动帮助我们校验数据,但浏览器校验数据是在前端页面的代码层面上进行的,这会导致我们的数据极其不安全,所以一般不会使用。

novalidate:取消浏览器自动校验数据的功能

<from action="" method="post" novalidate>

froms组件展示提示信息实例:

def login(request):
    form_obj = MyForm()
    if request.method == \'POST\':
        # 获取用户数据
        # request.POST 可看为一个字典
        # 校验用户数据
        # MyForm() forms组件校验数据刚好需要传入一个字典
        # 上述两步可以合一步
        form_obj = MyForm(request.POST)
        if form_obj.is_valid():
            return HttpResponse(\'登录成功\')
    return render(request,\'login.html\',locals())


{% for form in form_obj %}
    <P>
        {{ form.lable }}:{{ form }}
        {{ form.errors.0 }}
    </p>
{% endfor %}

forms组件常用参数

max_length			最大范围
min_length			最小范围
label				字段文本内容
required			字段是否必填 默认为True
error_messages			定义提示信息
widget				定义字段类型和属性
validators			额外的校验功能(一般都是正则)
initial				设置默认值

forms组件钩子函数

钩子函数提供更加复杂的与业务相关的校验功能,一般情况下,我们可以在form类中自定义钩子函数,来实现自定义的验证功能。

局部钩子

我们在只对单个字段校验时使用局部钩子。

例如,校验用户名是否已存在:

def clean_username(self):
    username = self.cleaned_data.get(\'username\')  # 获取用户名
    if username == \'abc\':  # 判断用户名
        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

ps:钩子函数都是在数据校验的最后一个环节执行

forms组件常用字段和插件

创建Form类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成HTML。

initial

初始值,用于设置input框里面的初始值。

class login(forms.Form):
    username = forms.CharField(
    	label = "用户名",
        initial = "张三"  # 设置默认值
    )

error_messages

重要错误信息。

class login(forms.Form):
    username = forms.CharField(
        min_length = 8,
        label = \'用户名\',
        error_messages = {
            "required" : "不能为空",
            "invalid" : "格式错误",
            "min_length" : "用户名最短8位"
        }
    )

widget可更改input的type,具体如下:

password

class login(forms.Form):
    pwd = forms.CharField(
        label = "密码",
        widget = forms.widgets.PasswordInput()
    )

radioselect

单radio

class login(forms.Form):
    gender = forms.ChoiceField(
        choices = ((1, "男"), (2, "女"), (3, "保密")),
        label = "性别",
        initial = 3,
        widget = forms.widgets.RadioSelect()
    )

单选Select

class login(forms,Form):
    hobby = forms.ChoiceField(
        choices = ((1, "篮球"), (2, "足球"), (3, "双色球")),
        label = "爱好"
        initial = 3,
        widget = forms.widgets.Select()
    )

多选Select

class login(forms,Form):
    hobby = forms.MultipleChoiceField(
        choices = ((1, "篮球"), (2, "足球"), (3, "双色球")),
        label = "爱好"
        initial = [1, 3],
        widget = forms.widgets.SelectMultiple()
    )

单选checkbox

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

多选checkbox

class LoginForm(forms.Form):
    hobby = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
	)

补充:

attrs

可设置input框的class

例:

class login(form.Form):
    pwd = forms.CharField(
        label = "密码",
        widget = forms.widgets.PasswordInput(attrs={\'class\' : \'c1\'})
    )

以上是关于Django Forms组件的主要内容,如果未能解决你的问题,请参考以下文章

django—Form组件

Django框架进阶7 forms组件(pycharm内置测试环境Python Console), cookie与session操作

Django组件-forms组件

Django组件-Forms组件

Django组件——forms组件

Django组件-forms组件