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

Django之forms.Form的更多相关文章

  1. django 表单系统 之 forms.Form

    继承forms.Form实现django表单系统 参考: https://www.cnblogs.com/zongfa/p/7709639.html https://www.cnblogs.com/c ...

  2. Django ModelForm and Form

    django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form 基于dj ...

  3. 5.django笔记之form保存表单信息,动态select

    作者:刘耀 一.使用form保存用户输入过的信息 场景:例如 如果用户注册,那么他输入n多个表单之后,那么他提交是时候,如果错误返回的时候,那么需要重新再输入表单内容.这样会影响用户体验,所以,使用f ...

  4. 3.django笔记之form表单

    作者:刘耀 瞎copy伸手党 我在诅咒你. Django的form的作用: 1.生成html标签 2.用来做用户提交的验证 3.可以和models一起使用(modelform) 一.form基础 工程 ...

  5. Django中的Form(二)

    一.保存用户输入内容 如果用户输入一张表单提交后出现错误时,会出现重现填写的情况.我们可以把用户输入的信息保存下来,并返回到前台页面,这样用户就无需再次输入. views.py # coding:ut ...

  6. Django中的Form

    Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from dj ...

  7. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  8. Django使用forms来实现评论功能

    貌似Django从版本1.6开始就放弃了对自带的comments的使用,具体原因未查,但是现在使用Django的内部的模块也可以实现评论功能,那就是借助于forms模块,下面是我的一个小例子. 环境准 ...

  9. Django组件-Forms组件

    Django的Forms组件主要有以下几大功能: 页面初始化,生成HTML标签 校验用户数据(显示错误信息) HTML Form提交保留上次提交数据 一.小试牛刀 1.定义Form类 from dja ...

随机推荐

  1. Winsock select server 与 client 示例代码

    参考 https://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancediomethod5.html ...

  2. HashMap源码解析JDK8

    一.HashMap基础 1.1 HashMap的定义 我们先看一下HashMap的定义: public class HashMap<K,V> extends AbstractMap< ...

  3. 编写管理IP地址参数脚本(永久性)

    1.用各种命令取出/etc/passwd文件前5行的最后一个字母.(2种) 2.编写管理IP地址参数脚本(永久性) a.只能用sed命令完成 b.提示用户变量赋值(IP.子网掩码.网关.DNS等) c ...

  4. iOS架构入门 - MVC模式实例演示

    MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外,此模式通过对复杂度的简化,使程序结构更加直观 控制器(Controller)-- ...

  5. JAVA编程思想 Ch3.5题

    练习5:创建一个class类,包含连两个String字段 :name.says.在main方法中创建两个Dog方法 一个命名为spot 叫声为 Ruff,另一个命民为scruffy,叫声为:Wuff: ...

  6. Mobile Communication

    最近面试有被问到LTE,感觉说得不太清楚,重新整理一遍. 一.第一代移动通信系统 1G,诞生于1980年左右.模拟通信系统,抗干扰性能差,使用FDMA技术,主要用来传输话音信号,最拉风的就是" ...

  7. 一文带你深入了解 Lambda 表达式和方法引用

    前言 尽管目前很多公司已经使用 Java8 作为项目开发语言,但是仍然有一部分开发者只是将其设置到 pom 文件中,并未真正开始使用.而项目中如果有8新特性的写法,例如λ表达式.也只是 Idea Al ...

  8. NEON中的vshr vshl vext中的位移参数必须为编译时字面常量

    NEON中的vshr指令中位移数量参数必须为compile time literal constant,因为该参数是被encoded as part pf ARM instruction itself ...

  9. Azkaban无法连接网页

    出的问题如下图 首先我查看日志看到有一个 [ERROR] 2020/03/13 11:12:34.417 +0800 ERROR [PluginCheckerAndActionsLoader] [Az ...

  10. 一文教你快速搞懂速度曲线规划之T形曲线(超详细+图文+推导+附件代码)

    运动控制中常用的T速度曲线规划的原理和程序实现,最后给出了测试结果: 如果本文帮到了您,请帮忙点个赞