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})#检测到错误,刷新页面,保留原数据