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

 from django.shortcuts import render,HttpResponse
from django import forms
from app01 import models
from django.core.validators import RegexValidator
import re
from django.core.exceptions import ValidationError #自定义校验函数,直接在字段validators中使用
def name_valid(value):
name_re=re.compile(r'^[a-zA-Z_]+$')
if not name_re.match(value):
raise ValidationError("只能以字母下划线开头!") class Myform(forms.Form):
name = forms.CharField(
# required=True, # 默认为True
min_length=2,
max_length=6,
initial='abc', # 默认值
help_text='长度为2到6个字符!', # 帮助信息
error_messages=[{ # 自定义错误提示信息(默认为英文)
'required': '不能为空!',
'min_length': '不能少于2个字符!'
}],
validators=[RegexValidator(r'^(\w)+$','用户名只能有字母数字下划线组成!'), name_valid], # 自定义校验规则(列表中放自定义函数名,或者引入django内置的RegexValidator校验器)
# disabled=True#默认为True显示
)
# 密文
password = forms.CharField(
widget=forms.TextInput(attrs={'type': 'password'}),
)
# 日期
birth = forms.DateField(
widget=forms.TextInput(attrs={'type': 'date'})
)
# 单选
sex = forms.ChoiceField(
choices=[('', '男 '), ('', '女')],
# widget=forms.Select()#下拉单选(默认)
# widget=forms.RadioSelect()#正常单选 # widget = forms.CheckboxInput()#记住账号密码(label='记住账号密码',initial='checked',choices=[('True',1),('False',0)])
) publish = forms.ModelChoiceField(
queryset=models.Publish.objects.all() # 只能用all结果才能正常显示,必须设置__str__,否则拿到是对象
# widget和ChoiceFiled一样设置
)
# 多选
hobby = forms.MultipleChoiceField( choices=[('', 'wan '), ('', 'ee')],
# widget=forms.SelectMultiple()#下拉多选(默认)
# widget=forms.CheckboxSelectMultiple()#正常多选
)
author = forms.ModelMultipleChoiceField(
queryset=models.Author.objects.all() # 只能用all结果才能正常显示,必须设置__str__,否则拿到是对象
# widget和MultipleChoiceField一样设置
) def __init__(self,*args,**kwargs):#初始化对字段进行样式设置
super().__init__(*args,**kwargs)
for filed in self.fields:
self.fields[filed].widget.attrs.update({'class':'form-control'}) def form(request):
if request.method=='GET':
form_obj=Myform()
return render(request, 'form.html', {'form_obj':form_obj})
else:
form_obj=Myform(request.POST)#对提交的数据进行组件类实例化
if form_obj.is_valid():#校验提交的数据对象(字段校验-->validators校验(RegexValidator模块或者自定义函数)-->局部钩子-->全局钩子)
print(form_obj.cleaned_data)#form_obj.clean_data已经校验完的所有值
return HttpResponse('ok')
else:
return render(request,'form.html',{'form_obj':form_obj})#检测到错误,刷新页面,保留原数据

views.py

form.html

 {% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<title>form</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-8 col-xs-offset-2">
<h2>注册信息表:</h2>
{% for field in form_obj %}
<p> <label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<span class="text-danger">{{ field.errors.0 }}</span>
</p>
{% endfor %}
</div>
</div>
</div>
</body>
<script src="{% static 'jquery-3.4.1.js' %}"></script>
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</html>

form.html

最新文章

  1. 修改pip更新源
  2. 安装Fedora 24后必要的设置
  3. JS小游戏-蓝色拼图
  4. table.appand(行数据) datagrid分页
  5. mysql外键实战
  6. js 表单操作
  7. 解决setInterval计时器不准的问题
  8. SQL Server调优系列基础篇 - 子查询运算总结
  9. Linux使用fdisk进行磁盘管理
  10. 浅谈vertical-align
  11. C#输出日历
  12. 基于Emgucv,C#的图片旋转方式
  13. 利用ResultFilter实现asp.net mvc 页面静态化
  14. Android 9.0新特性
  15. (转)Spring Boot 2 (四):使用 Docker 部署 Spring Boot
  16. [UE4]Named Slot
  17. Android Studio中的大量findViewById
  18. python进阶(六) 虚拟环境git clone报错解决办法
  19. Android6.0中PowerManagerService分析
  20. 2.3 Oracle之DDL 语句(约束、伪列、视图、序列、同义词) 精简版

热门文章

  1. Bat 脚本 删除某一行
  2. ansible的模块使用
  3. 关于用C-free进行C语言编程在电脑中生成的.exe和.o文件
  4. vue-cli3.0 gui初体验
  5. Condition的await()和signal()流程
  6. 怎样借助Python爬虫给宝宝起个好名字
  7. Windows 10 MSDN官方原版ISO镜像(简体中文)下载
  8. CF思维联系– Codeforces-989C C. A Mist of Florescence
  9. 最长递增子序列(Longest increasing subsequence)
  10. 从零开始通过webhooks实现前端自动化