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='长度为2到6个字符!', # 帮助信息
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
最新文章
- 修改pip更新源
- 安装Fedora 24后必要的设置
- JS小游戏-蓝色拼图
- table.appand(行数据) datagrid分页
- mysql外键实战
- js 表单操作
- 解决setInterval计时器不准的问题
- SQL Server调优系列基础篇 - 子查询运算总结
- Linux使用fdisk进行磁盘管理
- 浅谈vertical-align
- C#输出日历
- 基于Emgucv,C#的图片旋转方式
- 利用ResultFilter实现asp.net mvc 页面静态化
- Android 9.0新特性
- (转)Spring Boot 2 (四):使用 Docker 部署 Spring Boot
- [UE4]Named Slot
- Android Studio中的大量findViewById
- python进阶(六) 虚拟环境git clone报错解决办法
- Android6.0中PowerManagerService分析
- 2.3 Oracle之DDL 语句(约束、伪列、视图、序列、同义词) 精简版
热门文章
- Bat 脚本 删除某一行
- ansible的模块使用
- 关于用C-free进行C语言编程在电脑中生成的.exe和.o文件
- vue-cli3.0 gui初体验
- Condition的await()和signal()流程
- 怎样借助Python爬虫给宝宝起个好名字
- Windows 10 MSDN官方原版ISO镜像(简体中文)下载
- CF思维联系– Codeforces-989C C. A Mist of Florescence
- 最长递增子序列(Longest increasing subsequence)
- 从零开始通过webhooks实现前端自动化