forms模块

Django中的forms模块

在Django中提供了 forms 模块,用forms 模块可以自动生成form内部的表单控件,同时在服务器端可以用对象的形式接收并操作客户端表单元素,并能对表单的数据进行服务器端验证

一forms模块的作用

  通过 forms 模块,允许将表单与class相结合,允许通过 class 生成表单

二使用 forms 模块的步骤

1.在应用中创建 forms.py

2.导入 django 提供的 forms

  from django import forms

3.创建class,一个class会生成一个表单

#定义表单类
class ClassName(forms.Form):
        ... 

4.在 class 中创建类属性

  一个类属性对应到表单中是一个控件

5.利用Form 类型的对象自动成表单内容

6.读取form表单并进行验证数据

三form.Form的语法

  属性 = forms.Field类型(参数)

1.类型

class XXX(froms.Form):
    forms.CharField() : 文本框 <input type="text">
    forms.ChoiceField() : 下拉选项框 <select>
    forms.DateField() : 日期框 <input type="date">
    ... ...

2.参数

  • label:控件前的文本
  • widget:指定小部件
  • initial:控件的初始值(主要针对文本框类型)
  • required:是否为必填项,值为(True/False)

form表单示例

手动实现Form表单

<form action="/test_form1" method="post">
    <div>
        <label for="id_input_text">请输入内容:</label> <input type="text" name="input_text" id="id_input_text" />
    </div>
    <button type="submit">提交</button>
</form>

Django Form 实现 Form 表单

class MySearch(forms.Form):
    input_text = forms.CharField(label = '请输入内容')

四在模板中解析form对象

1.方法

  需要自定义

  表单中的按钮需要自定义

2.解析from对象

在 视图中创建form对象并发送到模板中解析.
ex:
    form = XXXForm()
    return render(request,'xx.html',locals())

  (1)手动解析 {% for field in form %}

      field : 表示的是form对象中的每个属性(控件)

      {{field.label}} : 表示的是label参数值

      {{field}} : 表示的就是控件

      {% endfor %}

  (2)自动解析

    {{form.as_p}} 将form中的每个属性(控件/文本)都使用p标记包裹起来再显示

    {{form.as_ul}} 将form中的每个属性(控件/文本)都使用li标记包裹起来再显示

      注意:必须手动提供ol 或 ul 标记

    {{form.as_table}} 将 form 中的每个属性(控件/文本)都使用tr标记包裹起来再显示

      注意:必须手动提供table标记

五通过 forms 对象获取表单数据

1.通过 forms.Form 子类的构造器来接收 post 数据

  form = XXXForm(request.POST)

2.必须是 form 通过验证后,才能取值

  form.is_valid()

    返回True:通过验证,可以取值

    返回False:暂未通过验证,则不能取值

3.通过 form.cleaned_data 字典的属性接收数据

  form.cleaned_data : dict 类型

六Field 内置小部件 - widget

1.什么是小部件

  表示的是生成到网页上的控件以及一些其他的html属性

message=forms.CharField(widget=forms.Textarea)
upwd=forms.CharField(widget=forms.PasswordInput)

2.常用的小部件类型

widget名称 对应和type类值
TextInput type='text'
PasswordInput type='password'
NumberInput type="number"
EmailInput type="email"
URLInput type="url"
HiddenInput type="hidden"
CheckboxInput type="checkbox"
CheckboxSelectMultiple type="checkbox"
RadioSelect type="radio"
Textarea textarea标记
Select select标记
SelectMultiple select multiple 标记

3.小部件的使用

(1)继承子forms.Form

语法

属性 = forms.CharField() #无预选值使用
    text,password,email,url,textarea,checkbox
属性 = forms.ChoiceField() #有预选值使用
    checkbox,radio,select

属性 = forms.CharField(
    label='xxx',
    widget=forms.小部件类型
)

示例

upwd = forms.CharField(
    label='用户密码',
    widget=forms.PasswordInput
)

message = forms.CharField(
    label='评论内容',
    widget=forms.Textarea
)

文档参见https://docs.djangoproject.com/en/1.11/topics/forms/

七form表单验证

django form 提供表单和字段验证

当在创建有不同的多个表单需要提交的网站时,用表单验证比较方便验证的封装

当调用form.is_valid() 返回True表示当前表单合法,当返回False说明表单验证出现问题

验证步骤:

  1.先对form.XXXField() 参数值进行验证,比如:min_length,max_length, validators=[...],如果不符合form.is_valid()返回False

  2.对各自from.clean_zzz属性名(self): 方法对相应属性进行验证,如果验证失败form.is_valid()返回False

  3.调胳form.clean(self): 对表单的整体结构进行验证,如果验证失败form.is_valid()返回False

  4.以上验证都成功 form.is_valid()返回True

验证方法:

validators = [验证函数1, 验证函数1]

  验证函数验证失败抛出forms.ValidationError

  验证成功返回None

def clean_xxx属性(self):

  验证失败必须抛出forms.ValidationError

  验证成功必须返回xxx属性的值

def clean(self):

  验证失败必须抛出forms.ValidationError

  验证成功必须返回 self.cleaned_data

from django import forms
import re

mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
def mobile_validate(value):
    if not mobile_re.match(value):
        raise forms.ValidationError('手机号码格式错误')

class RegisterForm(forms.Form):
    username = forms.CharField(label='用户名')
    password = forms.CharField(label='请输入密码', widget=forms.PasswordInput)
    password2 = forms.CharField(label='再次输入新密码', widget=forms.PasswordInput)
    mobile = forms.CharField(label='电话号码', validators=[mobile_validate])

    def clean(self):
        pwd1 = self.cleaned_data['password']
        pwd2 = self.cleaned_data['password2']
        if pwd1 != pwd2:
            raise forms.ValidationError('两次密码不一致!')
        return self.cleaned_data  # 必须返回cleaned_data

    def clean_username(self):
        username = self.cleaned_data['username']
        if len(username) < 6:
            raise forms.ValidationError("用户名太短")
        return username
验证示例

 

posted @ 2019-07-25 20:16  maplethefox  阅读(341)  评论(0编辑  收藏  举报