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})#检测到错误,刷新页面,保留原数据
原文地址:https://www.cnblogs.com/open-yang/p/11223134.html