login_form.is_valid():
#是否校验通过 同时:
# #1.会把符合要求的数据放到 self.cleaned_data={"pwd":"123457}
# #2.把不符合要求的放到 self.errors={"user":"yuan",}
Django的Form主要具有一下几大功能:
- 生成HTML标签
- 验证用户数据(显示错误信息)
- HTML Form提交保留上次提交数据
- 初始化页面显示内容
通过Form验证有俩种形式
- Form表单提交
验证、并可以保留上次内容
- Ajax提交
验证、无需上次内容(Ajax提交数据页面不会刷新)
返回HttpResponse
前面根据回调函数值相应地做出跳转或者显示错误信息
小试牛刀
1、创建Form类
|
2、View函数
|
3、Html生成
|
初露锋芒
创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
1、Django中Form类内置字段如下:
常用字段
|
详细字段
|
2、Django内置插件
|
3、常用选择插件
|
展露头角
单选或者多选时、数据源是否可以实时更新、、、
在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。
方式一、
|
方式二、
使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现
|
更上一层楼
通过上述,Django的Form组件提供验证用户提交的数据并可以显示错误信息(或自定制),更能可以生成相应的Html代码。更是猜想到,仅仅根据Form组件的验证或许满足不了一些需求,于是建立再Form的验证功能上使其有很强的扩展性
一、基于Form组件的字段上的简单扩展
方式A
|
方式B
|
二、基于源码执行的流程上进行扩展
方式A
例如在注册一个账号时、通过Form的验证其账号符合规则时,还将要判断该账号是否存在于数据库,如存在则肯定是注册不通过的
自定义方法、单一字段逐个再次验证
from Formtest import models
from django import forms
from django.forms import fields
from django.forms import widgets
from django.core.exceptions import ValidationError,NON_FIELD_ERRORS
from django.core.validators import RegexValidator
class AjaxForm(forms.Form):
user=fields.CharField(
max_length=10,
required=False,
validators=[RegexValidator(r'^[a-z]+$', 'Enter a valid extension.', 'invalid')],
)
email=fields.EmailField()
def clean_user(self):
"""
Form中字段中定义的格式匹配完之后,执行此方法进行验证
:return:
"""
v = self.cleaned_data['user']
if models.UserInfo.objects.filter(user=v).count():
raise ValidationError('此用户名已经存在')
return v
def clean_email(self):
"""
email验证过之后、可以自定义验证该邮箱是否被使用...
:return:
"""
pass
方式B
from Formtest import models
from django import forms
from django.forms import fields
from django.forms import widgets
from django.core.exceptions import ValidationError,NON_FIELD_ERRORS
from django.core.validators import RegexValidator
class AjaxForm(forms.Form):
user = fields.CharField(
max_length=10,
required=False,
validators=[RegexValidator(r'^[a-z]+$', 'Enter a valid extension.', 'invalid')],
)
email = fields.EmailField()
def clean_user(self):
"""
Form中字段中定义的格式匹配完之后,执行此方法进行验证
:return:
"""
v = self.cleaned_data['user']
if models.UserInfo.objects.filter(user=v).count():
raise ValidationError('此用户名已经存在')
return v
def clean_email(self):
"""
email验证过之后、可以自定义验证该邮箱是否被使用...
:return:
"""
pass
def clean(self):
"""
在单字段自定义验证完成之后、也可以对整体进行一个验证
:return:
"""
value_dict = self.cleaned_data
user = value_dict.get('user')
email = value_dict.get('email')
if user == 'root' and email == 'root@163.com':
raise ValidationError('身份验证信息验证失败')
return value_dict
# ps: _post_clean是clean验证完之后进一步验证操作、一般用不到
# 全局错误信息地键是 __all__