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='长度为26个字符!'# 帮助信息

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

相关文章:

  • 2021-04-07
  • 2021-11-22
  • 2021-07-15
  • 2021-08-15
  • 2021-08-16
猜你喜欢
  • 2022-12-23
  • 2021-09-20
  • 2021-08-10
  • 2022-01-29
  • 2021-12-05
  • 2022-03-04
相关资源
相似解决方案