Django forms组件

一.编写表单类

通过Django提供的Form类来生成表单
注意事项:

  • 提前导入forms模块:from django import forms
  • 所有的表单类都要继承forms.Form类
  • 每个表单字段都有自己的字段类型比如CharField,它们分别对应一种HTML语言中的
    元素中的表单元素。
  • 字段中拥有不同的属性
from django import forms
class MyForm(forms.Form):
    name = forms.CharField(max_length=10,min_length=3,label='用户名')
    pwd = forms.CharField(max_length=10,min_length=3,label='密码')
    email = forms.CharField(label='邮箱')

#使用时实例化产生一个对象,传入要校验的数据(字典)
myform = MyForm(request.POST)

二.渲染模板

第一种方式:可扩展性最高

<form action="" method="post" >
    <p>用户名: {{ myform.name }}</p>
    <p>密码: {{ myform.pwd }}</p>
    <p>邮箱: {{ myform.email }}</p>
    <input type="submit" value="提交">
</form>

第二种方式:for循环form对象

<form action="" method="post" >
    {% for foo in myform %}
    <p>{{ foo.label }}:{{ foo }}</p>
    {% endfor %}
    <input type="submit" value="提交">
</form>

第三种方式:可扩展性最差,不推荐使用

<form action="" method="post" >
    {#{{ myform.as_p }}#}
    {{ myform.as_ul }}
    <input type="submit" value="提交">
</form>

三.渲染错误信息

视图层

def register(request):

    if request.method=="POST":
        form=UserForm(request.POST)
        if form.is_valid():
            print(form.cleaned_data)       # 所有干净的字段以及对应的值
        else:
            print(form.cleaned_data)       #
            print(form.errors)             # ErrorDict : {"校验错误的字段":["错误信息",]}
            print(form.errors.get("name")) # ErrorList ["错误信息",]
        return render(request,"register.html",locals())
    form=UserForm()
    return render(request,"register.html",locals())

模板层

<form action="" method="post" novalidate>
    {% csrf_token %}
    
    {% for field in form %}
        <div>
            <label for="">{{ field.label }}</label>
            {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
        </div>
    {% endfor %}
    <input type="submit" class="btn btn-default">

</form>

四.field常用的属性

1.field.label           字段对应的label信息
2.field.label_tag       自动生成字段的label标签,注意与{{ field.label }}的区别。
3.field.value           当前字段的值,比如一个Email字段的值someone@example.com
4.field.errors          包含错误信息的元素
5.field.is_hidden       用于判断当前字段是否为隐藏的字段,如果是,返回True
6.field.field           返回字段的参数列表。例如{{ char_field.field.max_length }}
7.field.help_text       字段的帮助信息

五. 使用表单验证数据

  1. Form.clean()

如果你要自定义验证功能,那么你需要重新实现这个clean方法。

  1. Form.is_valid()

调用is_valid()方法来执行绑定表单的数据验证工作,并返回一个表示数据是否合法的布尔值。

>>> data = {'subject': 'hello',
...         'message': 'Hi there',
...         'sender': 'foo@example.com',
...         'cc_myself': True}
>>> f = ContactForm(data)
>>> f.is_valid()
True

让我们试下非法的数据。下面的情形中,subject为空(默认所有字段都是必需的)且sender是一个不合法的邮件地址:

>>> data = {'subject': '',
...         'message': 'Hi there',
...         'sender': 'invalid email address',
...         'cc_myself': True}
>>> f = ContactForm(data)
>>> f.is_valid()
False
  1. Form.errors

表单的errors属性保存了错误信息字典:

>>> f.errors
{'sender': ['Enter a valid email address.'], 'subject': ['This field is required.']}

在这个字典中,键为字段的名称,值为错误信息的Unicode字符串组成的列表。错误信息保存在列表中是因为字段可能有多个错误信息。

  1. Form.errors.as_data()

返回一个字典,它将字段映射到原始的ValidationError实例。

>>> f.errors.as_data()
{'sender': [ValidationError(['Enter a valid email address.'])],
'subject': [ValidationError(['This field is required.'])]}
  1. Form.errors.as_json(escape_html=False)

返回JSON序列化后的错误信息字典。

>>> f.errors.as_json()
{"sender": [{"message": "Enter a valid email address.", "code": "invalid"}],
"subject": [{"message": "This field is required.", "code": "required"}]}
  1. Form.add_error(field, error)

向表单特定字段添加错误信息。

field参数为字段的名称。如果值为None,error将作为Form.non_field_errors()的一个非字段错误。

  1. Form.has_error(field, code=None)

判断某个字段是否具有指定code的错误。当code为None时,如果字段有任何错误它都将返回True。

  1. Form.non_field_errors()

返回Form.errors中不是与特定字段相关联的错误。

六.局部钩子

rom django.core.exceptions import NON_FIELD_ERRORS, ValidationError
def clean_name(self):
	val=self.cleaned_data.get("name")
	ret=UserInfo.objects.filter(name=val)
	if not ret:
		return val
	else:
		raise ValidationError("该用户已注册!")

def clean_tel(self):
	val=self.cleaned_data.get("tel")
	if len(val)==11:
		return val
	else:
		raise  ValidationError("手机号格式错误")

七.全局钩子

def clean(self):
	pwd=self.cleaned_data.get('pwd')
	r_pwd=self.cleaned_data.get('r_pwd')

	if pwd and r_pwd:
		if pwd==r_pwd:
			return self.cleaned_data
		else:
			raise ValidationError('两次密码不一致')
	else:

		return self.cleaned_data
posted @ 2018-11-22 20:31  Yven  阅读(331)  评论(0编辑  收藏  举报