Django之forms.Form
django中的form组件提供了普通表单提交及验证数据的主要功能:
1. 生成页面可用的HTML标签
2. 对用户提交的数据进行验证
3. 可保留用户上次提交的数据
django中使用form组件
(一)在py文件(可以是视图,也可新建后在视图引入使用)创建一个form组件类,必须继承forms.Form类(fromdjangoimportforms)
1. 类中定义的字段都可在模板中渲染成相应的HTML表单标签
class Inform(forms.Form):
name=forms.CharField()
#CharField类实例化的字段渲染后是type='text'的input标签(实例化参数可以改变type类型)
password=forms.CharField()
2. 类中定义的字段根据实例化该字段的类生成不同的标签
class Inform(forms.Form):
name=forms.CharField()
password = forms.CharField(
# 字段对象的类的实例化通过插件widget修改生成的HTML标签,attrs可以设置多个属性
# widget=forms.TextInput(attrs={'type': 'password'}),
widget=forms.PasswordInput(render_value=True),#插件(设置保存密码)
)
3. 类中定义的字段的类的实例化可以设置相应的参数进行配置
class Inform(forms.Form):
name = forms.CharField(
# required=True, # 默认为True
min_length=2,#最小长度
max_length=6,#最大长度
initial='张三', # 默认值
help_text='长度为2到6个字符!', # 帮助信息
error_messages=[{ #自定义错误提示信息(默认为英文)
'required':'不能为空!',
'min_length':'不能少于2个字符!'·
}],
validators=[],#自定义校验规则(列表中放自定义函数名,或者引入django内置的RegexValidator校验器)
# disabled=True#默认为True显示
)
password = forms.CharField(
# widget=forms.TextInput(attrs={'type': 'password'}),
widget=forms.PasswordInput(),
)
(二)在相应的视图函数中实例化该类之后,当成模板变量通过render进行模板渲染时自定义form组件中的字段都会以标签显示
views.py
1 from django.shortcuts import render,HttpResponse 2 from django import forms 3 from app01 import models 4 from django.core.validators import RegexValidator 5 import re 6 from django.core.exceptions import ValidationError 7 8 #自定义校验函数,直接在字段validators中使用 9 def name_valid(value): 10 name_re=re.compile(r'^[a-zA-Z_]+$') 11 if not name_re.match(value): 12 raise ValidationError("只能以字母下划线开头!") 13 14 class Myform(forms.Form): 15 name = forms.CharField( 16 # required=True, # 默认为True 17 min_length=2, 18 max_length=6, 19 initial='abc', # 默认值 20 help_text='长度为2到6个字符!', # 帮助信息 21 error_messages=[{ # 自定义错误提示信息(默认为英文) 22 'required': '不能为空!', 23 'min_length': '不能少于2个字符!' 24 }], 25 validators=[RegexValidator(r'^(\w)+$','用户名只能有字母数字下划线组成!'), name_valid], # 自定义校验规则(列表中放自定义函数名,或者引入django内置的RegexValidator校验器) 26 # disabled=True#默认为True显示 27 ) 28 # 密文 29 password = forms.CharField( 30 widget=forms.TextInput(attrs={'type': 'password'}), 31 ) 32 # 日期 33 birth = forms.DateField( 34 widget=forms.TextInput(attrs={'type': 'date'}) 35 ) 36 # 单选 37 sex = forms.ChoiceField( 38 choices=[('0', '男 '), ('1', '女')], 39 # widget=forms.Select()#下拉单选(默认) 40 # widget=forms.RadioSelect()#正常单选 41 42 # widget = forms.CheckboxInput()#记住账号密码(label='记住账号密码',initial='checked',choices=[('True',1),('False',0)]) 43 ) 44 45 publish = forms.ModelChoiceField( 46 queryset=models.Publish.objects.all() # 只能用all结果才能正常显示,必须设置__str__,否则拿到是对象 47 # widget和ChoiceFiled一样设置 48 ) 49 # 多选 50 hobby = forms.MultipleChoiceField( 51 52 choices=[('1', 'wan '), ('2', 'ee')], 53 # widget=forms.SelectMultiple()#下拉多选(默认) 54 # widget=forms.CheckboxSelectMultiple()#正常多选 55 ) 56 author = forms.ModelMultipleChoiceField( 57 queryset=models.Author.objects.all() # 只能用all结果才能正常显示,必须设置__str__,否则拿到是对象 58 # widget和MultipleChoiceField一样设置 59 ) 60 61 def __init__(self,*args,**kwargs):#初始化对字段进行样式设置 62 super().__init__(*args,**kwargs) 63 for filed in self.fields: 64 self.fields[filed].widget.attrs.update({'class':'form-control'}) 65 66 def form(request): 67 if request.method=='GET': 68 form_obj=Myform() 69 return render(request, 'form.html', {'form_obj':form_obj}) 70 else: 71 form_obj=Myform(request.POST)#对提交的数据进行组件类实例化 72 if form_obj.is_valid():#校验提交的数据对象(字段校验-->validators校验(RegexValidator模块或者自定义函数)-->局部钩子-->全局钩子) 73 print(form_obj.cleaned_data)#form_obj.clean_data已经校验完的所有值 74 return HttpResponse('ok') 75 else: 76 return render(request,'form.html',{'form_obj':form_obj})#检测到错误,刷新页面,保留原数据
form.html
1 {% load static %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> 7 <title>form</title> 8 </head> 9 <body> 10 <div class="container"> 11 <div class="row"> 12 <div class="col-xs-8 col-xs-offset-2"> 13 <h2>注册信息表:</h2> 14 {% for field in form_obj %} 15 <p> 16 17 <label for="{{ field.id_for_label }}">{{ field.label }}</label> 18 {{ field }} 19 <span class="text-danger">{{ field.errors.0 }}</span> 20 </p> 21 {% endfor %} 22 </div> 23 </div> 24 </div> 25 </body> 26 <script src="{% static 'jquery-3.4.1.js' %}"></script> 27 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script> 28 </html>