Django之form表单常用字段与插件
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 # Create your views here. 9 10 #自定义校验函数,直接在字段validators中使用 11 def name_valid(value): 12 name_re=re.compile(r'^[a-zA-Z_]+$') 13 if not name_re.match(value): 14 raise ValidationError("只能以字母下划线开头!") 15 16 class Myform(forms.Form): 17 18 name = forms.CharField( 19 # required=True, # 默认为True 20 label='用户名', 21 min_length=2, 22 max_length=6, 23 initial='abc', # 默认值 24 help_text='长度为2到6个字符!', # 帮助信息 25 error_messages=[{ # 自定义错误提示信息(默认为英文) 26 'required': '不能为空!', 27 'min_length': '不能少于2个字符!' 28 }], 29 validators=[RegexValidator(r'^(\w)+$','用户名只能有字母数字下划线组成!'), name_valid], # 自定义校验规则(列表中放自定义函数名,或者引入django内置的RegexValidator校验器) 30 # disabled=True#默认为True显示 31 32 ) 33 34 # 密文 35 password = forms.CharField( 36 widget=forms.TextInput(attrs={'type': 'password'}), 37 ) 38 # 日期 39 birth = forms.DateField( 40 widget=forms.TextInput(attrs={'type': 'date'}) 41 ) 42 # 单选 43 sex = forms.ChoiceField( 44 choices=[('0', '男 '), ('1', '女')], 45 # widget=forms.Select()#下拉单选(默认) 46 # widget=forms.RadioSelect()#正常单选 47 48 # widget = forms.CheckboxInput()#记住账号密码(label='记住账号密码',initial='checked',choices=[('True',1),('False',0)]) 49 ) 50 #单选:通过orm显示数据 51 publish = forms.ModelChoiceField( 52 queryset=models.Publish.objects.all() # 只能用all结果才能正常显示,必须设置__str__,否则拿到是对象 53 # widget和ChoiceFiled一样设置 54 ) 55 56 # 多选 57 hobby = forms.MultipleChoiceField( 58 59 choices=[('1', 'wan '), ('2', 'ee')], 60 # widget=forms.SelectMultiple()#下拉多选(默认) 61 # widget=forms.CheckboxSelectMultiple()#正常多选 62 ) 63 #多选:通过orm显示数据 64 author = forms.ModelMultipleChoiceField( 65 queryset=models.Author.objects.all() # 只能用all结果才能正常显示,必须设置__str__,否则拿到是对象 66 # widget和MultipleChoiceField一样设置 67 ) 68 69 def __init__(self,*args,**kwargs):#初始化对字段进行样式设置 70 super().__init__(*args,**kwargs) 71 for filed in self.fields: 72 self.fields[filed].widget.attrs.update({'class':'form-control'}) 73 74 def form(request): 75 if request.method=='GET': 76 form_obj=Myform() 77 return render(request, 'form.html', {'form_obj':form_obj}) 78 else: 79 form_obj=Myform(request.POST)#对提交的数据进行组件类实例化 80 if form_obj.is_valid():#校验提交的数据对象(字段校验-->validators校验(RegexValidator模块或者自定义函数)-->局部钩子-->全局钩子) 81 print(form_obj.cleaned_data)#form_obj.clean_data已经校验完的所有值 82 return HttpResponse('ok') 83 else: 84 return render(request,'form.html',{'form_obj':form_obj})#检测到错误,刷新页面,保留原数据