Django进阶--表单-初识

Django进阶–表单-初识

1. 简介

form表单中的数据流动于前后端,需要验证数据的合法性。Django提供了form表单功能用于验证数据合法性和创建html代码。

form表单功能类似于数据库的模型功能,可看作一个中间件。


2. 创建

2.1 创建模块

在app目录下创建forms.py模块.

-practise
 -practise
 -book
  -forms.py
  -urls.py
  ......

2.2 自定义表单类

class RegisterForm(forms.Form):
    uname = forms.CharField(max_length=20, min_length=6, label='用户名')
    password = forms.CharField(max_length=8, min_length=6,
                               widget=forms.PasswordInput(attrs={'placeholder': '请输入密码'}),
                               error_messages={'min_length': '密码长度小于6',
                                               'max_length': '密码长度超过8'
                                               },
                               label='密码',
                               )
    password_repeat = forms.CharField(widget=forms.PasswordInput(), label='确认密码')
    email = forms.EmailField(label='邮件', required = False)
  • 表单是通过类实现的,继承自forms.Form,然后在里面定义要验证的字段**.**
  • 虽然form可以生成前端页面,但这个功能实际用的少,主要是是用form表单的验证功能
  • max_length : 最大长度
  • widget : 负责渲染网页上的表单,用于设置样式等
  • attrs:包含渲染后的Widget 将要设置的HTML 属性
  • error_messages:报错信息
  • required:为False表示允许为空

3. 使用

3.1 视图函数调用

def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)  #将RegisterForm类生成实例,传入模板渲染前端页面
        if form.is_valid():
            password = form.cleaned_data.get('password')
            password_repeat = form.cleaned_data.get('password_repeat')
            if password == password_repeat:
                return HttpResponse('注册成功')
    form = RegisterForm()
    return render(request, 'book/register.html', {'form': form})
  • 生成表单类实例,传递给前端
  • is_valid()方法:验证提交数据的合法性。如果所有字段都包含有效数据,则将表单的数据放在self.cleaned_data属性中
  • cleaned_data: 返回字典,里面包含通过验证后的正确数据。

3.2 前端调用

<form action="" method="post">
    {% csrf_token %}
    {{ form.as_ul }}
    <input type="submit" value="提交">
</form>
  • form类只能渲染内容,具体的骨架(form标签及三元素)及提交按钮,需要自定义。
  • csrf_token:防止csrf(跨站请求伪造)攻击。
  • as_ul:将每个元素渲染在ul标签额内。

4 Form属性及方法

4.1 form. is_bound

该属性表示Form对象是否绑定数据(即form对象中各个字段是否获取到了值)

  • 若未绑定则返回False,前端渲染出来的是一个未填写内容的表单(每个控件都没有值)
  • 若已绑定则返回True,前端渲染出来的是一个已填写内容的表单(每个控件都没有值),且后端可以获取到值。
form = RegisterForm(request.POST)
[in]: form.is_bound
[out]: True
    
[in]: form.cleaned_data
[out]:
'email' (140292802976152) = {str} '1@qq.com'
'password' (140292802428144) = {str} 'qweqwe'
'password_repeat' (140292701581232) = {str} 'qweqwe'
'uname' (140292827209656) = {str} 'qqqqqq'
__len__ = {int} 4

请注意,传递空字典会创建包含空数据的绑定表单:

>>> f = ContactForm({})
>>> f.is_bound
True

4.2 Form.is_valid()

is_valid()方法运行验证并返回数据是否有效,有效则返回True,反之False.

取上个例子中的form对象

# form = RegisterForm(request.POST)
>>form.is_valid()
>>True

4.3 Form.errors

该属性返回字典,里面包含验证后的错误信息。字典中,键是字段名称,值是表示错误消息的字符串列表。

#发送一次错误请求, 表单有做验证password 和 password_repeat必须一致
[in]:form.data
[out]'uname' (140292691724584) = {str} 'qqqqqq'
	'password' (140292691230128) = {str} '123qwe'
	'password_repeat' (140292691229616) = {str} 'qwe123'
	'email' (140292691723800) = {str} '1@qq.com'
[in]:form.errors.get('password_repeat')
[out]:<class 'list'>: [ValidationError(['密码不一致'])]  #即['密码不一致']

4.4 Form.fields

返回类字典对象,包含各个字段的对象

[in] form.fields
[out] 
'uname' (140292827209656) = {CharField} <django.forms.fields.CharField object at 0x7f98700d4f28>
'password' (140292802428144) = {CharField} <django.forms.fields.CharField object at 0x7f98700d4a20>
'password_repeat' (140292701581232) = {CharField} <django.forms.fields.CharField object at 0x7f98700d47b8>
'email' (140292802976152) = {EmailField} <django.forms.fields.EmailField object at 0x7f98700d45f8>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值