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='长度为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

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>
form.html
posted @ 2019-07-21 22:30  笑得好美  阅读(2791)  评论(0编辑  收藏  举报