forms组件

1. 校验字段功能

针对一个实例:注册用户讲解。

模型:models.py

class UserInfo(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
email=models.EmailField()
tel=models.CharField(max_length=32)

视图函数:register

from django.forms import widgets
from django.core.exceptions import ValidationError wid_01 = widgets.TextInput(attrs={"class": "form-control"}) #用了bootstrap,所以加个样式属性
wid_02 = widgets.PasswordInput(attrs={"class": "form-control"}) #注意!! 在校验失败后,form对象不保存PasswordInput的value值,所以页面要重新输入 class UserForm(forms.Form):
name = forms.CharField(min_length=3, label="用户名", error_messages={"required": "该字段不能为空", "min_length": "最小长度为3"},
widget=wid_01
)
pwd = forms.CharField(min_length=4, label="密码",
widget=wid_02
)
r_pwd = forms.CharField(min_length=4, label="确认密码", error_messages={"required": "该字段不能为空"},
widget=wid_02)
email = forms.EmailField(label="邮箱", error_messages={"required": "该字段不能为空", "invalid": "格式错误"},
widget=wid_01)
tel = forms.CharField(label="手机号", widget=wid_01) def register(request):
if request.method == "POST": print(request.POST) # form=UserForm({"name":"yu","email":"123@qq.com","xxxx":"alex"}) form = UserForm(request.POST) # form表单的name属性值应该与forms组件字段名称一致 print(form.is_valid()) # 返回布尔值 if form.is_valid():
print(form.cleaned_data) # {"name":"yuan","email":"123@qq.com"}
else:
print(form.cleaned_data) # {"email":"123@qq.com"}
# print(form.errors) # {"name":[".........."]}
# print(type(form.errors)) # ErrorDict : {"校验错误的字段":["错误信息",]}
# print(form.errors.get("name"))
# print(type(form.errors.get("name"))) # ErrorList ["错误信息",]
# print(form.errors.get("name")[0]) return render(request, "register.html", locals()) ''' form.is_valid() :返回布尔值
form.cleaned_data :{"name":"yuan","email":"123@qq.com"}
form.errors :{"name":[".........."]} ''' form = UserForm() return render(request, "register.html", locals())

2. 渲染标签功能

2.1 渲染方式1

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<h3>注册页面</h3>
<div class="container">
<div class="row">
<div class="col-md-6 col-lg-offset-3"> <form action="" method="post">
{% csrf_token %}
<div>
<label for="">用户名</label>
{{ form.name }}
</div>
<div>
<label for="">密码</label>
{{ form.pwd }}
</div>
<div>
<label for="">确认密码</label>
{{ form.r_pwd }}
</div>
<div>
<label for=""> 邮箱</label>
{{ form.email }}
</div> <input type="submit" class="btn btn-default pull-right">
</form>
</div>
</div>
</div> </body>
</html>

2.2 渲染方式2

<form action="" method="post">
{% csrf_token %} {% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }}
</div>
{% endfor %}
<input type="submit" class="btn btn-default pull-right"> </form>

2.3 渲染方式3

<form action="" method="post">
{% csrf_token %} {{ form.as_p }}
<input type="submit" class="btn btn-default pull-right"> </form>

3. 显示错误与重置输入信息功能

视图

def register(request):

    if request.method=="POST":
form=UserForm(request.POST)
if form.is_valid():
print(form.cleaned_data) # 所有干净的字段以及对应的值
else:
print(form.cleaned_data) #
print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
print(form.errors.get("name")) # ErrorList ["错误信息",]
return render(request,"register.html",locals())
form=UserForm()
return render(request,"register.html",locals())

模板

<form action="" method="post" novalidate>
{% csrf_token %} {% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" class="btn btn-default"> </form>

4. 局部钩子与全局钩子

视图


# forms组件
from django import forms
from django.core.exceptions import ValidationError class UserForm(forms.Form):
username = forms.CharField(min_length=3, max_length=6, label="用户名",
error_messages={"required": "该字段不能为空", "min_length": "最小长度为3", "max_length": "最大长度为6"}, )
password = forms.CharField(max_length=32, label="密码", error_messages={"required": "该字段不能为空"})
r_pwd = forms.CharField(max_length=32, label="确认密码", error_messages={"required": "该字段不能为空"})
email = forms.EmailField(label="邮箱", error_messages={"required": "该字段不能为空", "invalid": "格式错误"})
phone = forms.CharField(max_length=32, label="手机号") def __init__(self, *args, **kwargs): # 给每个标签添加属性
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs['class'] = 'form-control' # 局部钩子
def clean_username(self):
val = self.cleaned_data.get("username")
if not val.isdigit():
return val
else:
raise ValidationError("用户名不能是纯数字!") # 全局钩子 def clean(self):
pwd = self.cleaned_data.get("password")
r_pwd = self.cleaned_data.get("r_pwd") if pwd == r_pwd:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致!') def register(request):
form = UserForm()
if request.method == "POST":
form = UserForm(request.POST)
if form.is_valid():
print(form.cleaned_data)
user = UserInfo.objects.create_user(username=request.POST.get("username"),
password=request.POST.get("password"), phone=request.POST.get("phone"),
email=request.POST.get("email"))
return redirect("/blog/login/")
else:
errors = form.errors.get("__all__")
return render(request, "register.html", locals())
return render(request, "register.html", locals())

模板

<form action="" method="post">
{% csrf_token %}
<p>{{ form.username.label }}
{{ form.username }} <span class="pull-right error">{{ form.username.errors.0 }}</span>
</p>
<p>{{ form.password.label }}
{{ form.password }} <span class="pull-right error">{{ form.password.errors.0 }}</span>
</p>
<p>{{ form.r_pwd.label }}
{{ form.r_pwd }} <span class="pull-right error">{{ form.r_pwd.errors.0 }}</span>
<span class="pull-right error">{{ errors.0 }}</span>
</p>
<p>{{ form.email.label }}
{{ form.email }}<span class="pull-right error">{{ form.email.errors.0 }}</span></p>
<p>{{ form.phone.label }}
{{ form.phone }} <span class="pull-right error">{{ form.phone.errors.0 }}</span></p>
<button type="submit" class="btn btn-success">提交注册</button>
</form>

Django 之 Form的更多相关文章

  1. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  2. Django models Form model_form 关系及区别

    Django models Form model_form

  3. 【Django】--Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 例子: 1.创建Form类 from djan ...

  4. Django基础——Form&Ajax篇

    一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...

  5. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  6. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

  7. 69、django之Form组件

    本篇导航: 小试牛刀 Form类 常用选择插件 自定义验证规则 初始化数据 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次 ...

  8. Django的Form(二)

    上一篇已经简单介绍了Django的Form,现在开始进阶操作了 ..... 创建Form类的时候,主要涉及到Form字段和Form的插件,字段用于做form验证,插件用来生成HTML DjiangoF ...

  9. Django的Form

    Django的Form有两个基本用途: 1.用于生成html的Form表单 2.用于后台做表单验证 #!/usr/bin/env python # -*- coding:utf-8 -*- impor ...

  10. python Django之Form组件

    python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...

随机推荐

  1. SpringCloud之配置中心(config)的使用

    配置中心的作用就在于可以在项目启动时加载远程或本地的配置文件,将配置文件集中管理 springboot版本: 2.1.6.RELEASE springcloud版本: Finchley.RELEASE ...

  2. C++ 手动实现栈(stack) (课后作业版)

    栈,一种遵循先进先出原则的数据结构,可以用顺序表实现,也可以用链表进行实现. 这里我使用数组实现方法,包含了进栈,出栈,访问栈顶等功能,以及一些辅助功能. 栈Stack类定义如下: template ...

  3. Python 切片/列表/字符串之间装换

    1. 怎么实现字符串变为list 使用split(),把字符串拆分再存入数组: 例子 input="ni si shi" output=input.split(" &qu ...

  4. taskkill报taskkill不是内部或者外部命令,也不是可运行程序

    转载一下处理这个'taskkill报taskkill不是内部或者外部命令,也不是可运行程序' 的问题:https://blog.csdn.net/wangying_2016/article/detai ...

  5. 17.SQLite数据库存储

    Android系统内置一个SQLite数据库,SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了. SQLite不仅支持标准的SQL语法,还遵循了 ...

  6. 剑指 Offer II 动态规划

    088. 爬楼梯的最少成本 class Solution { public: int minCostClimbingStairs(vector<int>& cost) { int ...

  7. git的相关命令

    1.将文件添加至版本库的暂存区(stage)的命令是git add 1.1.  添加完所有有被修改的文件:git add . 1.2. 添加指定文件:git add 指定文件 2.将文件提交至本地仓库 ...

  8. ES6-moudle

    一.基础认知 结合案例体验module: 前面模拟模块是用立即执行的匿名函数,需要把某些通过window暴露出去,所以还是不能消除全局变量 module模块系统需要服务器环境才能正常执行,在html文 ...

  9. PHP 静态延迟绑定 static

    PHP (self static parent 区别) self调用的方法和属性始终表示当前类的方法和属性 static调用的方法和属性为当前执行的类的方法和属性 parent调用的方法和属性为父类的 ...

  10. 将本地文件推送到Gitee仓库

    完整的步骤 1.在gitee中创建仓库 2.下载.安装git 3.推送文件到gitee 推送文件到gitee 1.在要上传的文件夹空白处,点击右键,选择 git bash here 2.输入 git ...