form组件使用、常用字段、字段参数、自定义校验规则:

 

form组件

 

 

 

定义:

 

 from django import forms
 
 class RegForm(forms.Form):
     user = forms.CharField(label='用户名')
     pwd = forms.CharField(label='密码',widget=forms.PasswordInput)

 

使用:

 

视图函数:

 

 def reg2(request):
     form_obj = RegForm()
     if request.method == 'POST':
         form_obj = RegForm(request.POST)
         if form_obj.is_valid():
             # 校验成功
             # form_obj.cleaned_data # 清洗后的数据
             return HttpResponse('注册成功')
 
 
     return render(request, 'reg2.html', {'form_obj': form_obj})

 

模板:

 

 {{ form_obj.as_p }}   _>   生成所有字段的input框
 
 {{ form_obj.user }}         _> 某个字段的input框
 {{ form_obj.user.label }}   _> 某个字段的中文提示
 {{ form_obj.user.id_for_label }}   _> 某个字段的input框的ID
 
 
 {{ form_obj.errors }}   _> 所有的错误
 {{ form_obj.user.errors }} _> 某个字段的所有错误
 {{ form_obj.user.errors.0 }} _> 某个字段的第一个错误

 

常用的字段

 

 CharField  
 ChoiceField
 MultipleChoiceField  

 

字段的参数

 

 initial  初始值
 required 是否必填
 disabled 是否禁用
 label 中文提示
 initial   默认值
 min_length 最小长度
 error_messages   错误信息
 choices   可选择的数据

 

校验

 

  1. 自带的校验

  2. 自定义校验规则

    1. 写函数

       from django.core.exceptions import ValidationError
       
       
       def check_name(value):
           # 自定义校验规则
           # 如果校验合格 什么都不做
           # 校验不合格   抛出异常
           if 'alex' in value:
               raise ValidationError('不能包含alex,非法字符')
               
  3. 使用内置的校验器

     from django.core.validators import RegexValidator
     
     validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式不正确')]

 

局部钩子和全局钩子

 

 def clean_user(self):
     # 局部钩子
     # 校验成功 返回当前字段的值
     # 校验不成功 抛出异常
     if 'alex' in self.cleaned_data.get('user'):
         raise ValidationError('不能包含alex,非法字符')
     return self.cleaned_data.get('user')
 
 def clean(self):
     # 全局钩子
     # 校验成功 返回所有字段的值 self.cleaned_data
     # 校验不成功 抛出异常
     pwd = self.cleaned_data.get('pwd')
     re_pwd = self.cleaned_data.get('re_pwd')
     if pwd == re_pwd:
         return self.cleaned_data
     else:
         self.add_error('re_pwd','两次密码不一致!!!')
         raise ValidationError('两次密码不一致')

 

 

 

views:

from django.shortcuts import render,HttpResponse

# Create your views here.
def reg(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if len(pwd) <= 6:
return render(request,"reg.html",{"pwd_error":"你太短了"})
return render(request,"reg.html")

#从数据库中获取数据之前使用models:
from app01 import models

#继承之前导入forms:
from django import forms

#定义抛出异常功能:
from django.core.exceptions import ValidationError

#定义校验函数:
def check_name(value):
#自定义校验规则 :
#如果校验合格 什么都不做
#校验不合格 抛出异常
if "alex" in value:
raise ValidationError("不能包含alex,非法字符")

#定义django提供内置正则校验器:
from django.core.validators import RegexValidator

#使用form组件之前要定义类:
class RegForm(forms.Form):
#生成input框、默认值用initial:
user = forms.CharField(
#定义必填:
required=True,
#定义是否可以禁用:
# disabled=True,
label="用户名",
initial="alex",
#定义最小长度:
min_length=6,
#定义校验:
validators=[check_name],
#定义错误信息:error_messages
error_messages={
"required":"不能为空",
"min_length":"至少为6位",
}
)
#用密文需要加widget=forms.PasswordInput:
pwd = forms.CharField(label="密码",widget=forms.PasswordInput)
#定义确认密码功能:
re_pwd = forms.CharField(label="确认密码",widget=forms.PasswordInput)
#定义单选字段:
gender = forms.ChoiceField(choices=(("1","男"),("2","女"),),initial="2")
#定义多选字段:
# hobby = forms.MultipleChoiceField(initial=["1","3"],choices=(("1","抽烟"),("2","喝酒"),("3","吐口水"),))
#从数据库中获取:
# hobby = forms.MultipleChoiceField(initial=["1","3"],choices=models.Hobby.objects.values_list("id","name"),widget=forms.CheckboxSelectMultiple)
hobby = forms.MultipleChoiceField(initial=["1","3"],widget=forms.CheckboxSelectMultiple)
#手机号校验:
phone = forms.CharField(
validators=[RegexValidator(r"^1[3-9]\d{9}$","手机号格式不正确")]
)
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
#自定义操作:
print(self.fields)
self.fields["hobby"].choices = models.Hobby.objects.values_list("id","name")

#定义clean方法局部钩子:
def clean_user(self):
#校验成功 返回当前字段的值
#校验不成功 抛出异常
if "alex" in self.cleaned_data.get("user"):
raise ValidationError("不能包含alex,非法字符")
return self.cleaned_data.get("user")

#定义全局钩子:
def clean(self):
#全局钩子
#校验成功 返回所有字段的值 self.cleaned_data
#校验不成功 抛出异常
pwd = self.cleaned_data.get("pwd")
re_pwd = self.cleaned_data.get("re_pwd")
#判断如果相等返回所有字段的值:
if pwd == re_pwd:
return self.cleaned_data
else:
#定义添加错误的方法:
self.add_error("re_pwd","两次密码不一致!!!!")
raise ValidationError("两次密码不一致")

def reg2(request):
#拿到form对象:
form_obj = RegForm()
if request.method == "POST":
form_obj = RegForm(request.POST)
#校验用is_valid:
if form_obj.is_valid():
print(request.POST)
print(form_obj.cleaned_data,type(form_obj.cleaned_data))
return HttpResponse("注册成功")
return render(request,"reg2.html",{"form_obj":form_obj})

reg.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<form action="" method="post">
{# 加% csrf_token %}作用是可以提交post请求:#}
{% csrf_token %}
<p>
用户名:<input type="text" name="user">
</p>
<p>
密码:<input type="password" name="pwd"><span>{{ pwd_error }}</span>
</p>
<button>注册</button>
</form>
</body>
</html>

reg2:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<form action="" method="post" novalidate>
{% csrf_token %}
{# {{ form_obj.as_p }}#}
<p>
<label for="{{ form_obj.user.id_for_label }}">{{ form_obj.user.label }}</label>
{# 生成input框用对象点:#}
{{ form_obj.user }}<span> {{ form_obj.user.errors.0 }} </span>
</p>
<p>
<label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
{{ form_obj.pwd }}<span>{{ form_obj.pwd.errors.0 }}</span>
</p>
<p>
<label for="{{ form_obj.re_pwd.id_for_label }}">{{ form_obj.re_pwd.label }}</label>
{{ form_obj.re_pwd }}<span>{{ form_obj.re_pwd.errors.0 }}</span>
</p>
<p>
<label for="{{ form_obj.gender.id_for_label }}">{{ form_obj.gender.label }}</label>
{{ form_obj.gender }}
</p>
<p>
<label for="{{ form_obj.hobby.id_for_label }}">{{ form_obj.hobby.label }}</label>
{{ form_obj.hobby }}
</p>
<p>
<label for="{{ form_obj.phone.id_for_label }}">{{ form_obj.phone.label }}</label>
{{ form_obj.phone }}<span>{{ form_obj.phone.errors.0 }}</span>
</p>
{{ form_obj.errors }}
<button>注册</button>
</form>
</body>
</html>
posted @ 2019-12-28 17:42  干it的小张  阅读(687)  评论(0编辑  收藏  举报