Django的Form主要具有一下几大功能:

  • 生成HTML标签
  • 验证用户数据(显示错误信息)
  • HTML Form提交保留上次提交数据
  • 初始化页面显示内容

基本简单的操作:

from django import forms

class FM(forms.Form):
# 根据form表单中的name来做
username = fields.CharField(
error_messages={'required':'用户名不能为空'},
)
pwd = fields.CharField(
error_messages={'required':'密码不能为空','min_length':'请填写6位以上密码','max_length':'请填写12位以下密码'},
min_length=6,
max_length=12,
)
email = fields.EmailField(
error_messages={'required':'邮箱不合法','invalid':'邮箱格式不正确'}
)

Form.py

def index(request):
if request.method == 'GET':
# 解决错误提示后内容清空的问题
obj = FM()
return render(request,'form_index.html',{'obj': obj})
elif request.method == 'POST':
# 获取用户所有数据
# 每条数据请求验证
# 成功:获取用户提交的数据
# 失败:显示错误信息
obj = FM(request.POST)
# 验证是否合法
ret = obj.is_valid()
if ret:
print('obj.clean****',obj.clean())
print('obj.clead_data*****',obj.cleaned_data)
else:
print('obj.errors****',obj.errors)
print('obj.errors.as_json()*****',obj.errors.as_json())
print('obj****',obj)
# from django.forms.utils import ErrorDict
# obj.errors为ErrorDict类型,所以应该按照字典的方法获取值
print(type(obj.errors))
return render(request,'form_index.html',{'obj': obj,'error_msg': obj.errors})

Views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form验证组件</title>
<style>
.usernameTF{
background-color: coral;
color: aqua;
}
</style>
</head>
<body> <form action="/form_app/index" method="post">
{% csrf_token %}
<p><input type='text' name='username'/> {{ error_msg.username.0 }}</p>
<p><input type='text' name='pwd'/> {{ error_msg.pwd.0 }}</p>
<p><input type='text' name='email'/> {{ error_msg.email.0 }}</p>
<p><input type="submit" value="提交"></p>
</form> </body>
</html>

form_index.html

进阶操作:

主要涉及widget的使用、初始化默认值,以及记录上次填写的值

from django import forms
from django.forms import widgets
from django.forms import fields class FM(forms.Form):
# 根据form表单中的name来做
username = fields.CharField(
error_messages={'required':'用户名不能为空'},
widget=widgets.Textarea(attrs={'class':'usernameTF'})
)
pwd = fields.CharField(
error_messages={'required':'密码不能为空','min_length':'请填写6位以上密码','max_length':'请填写12位以下密码'},
min_length=6,
max_length=12,
widget=widgets.PasswordInput
)
email = fields.EmailField(error_messages={'required':'邮箱不合法','invalid':'邮箱格式不正确'})

Forms

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form验证组件</title>
<style>
.usernameTF{
background-color: coral;
color: aqua;
}
</style>
</head>
<body> <form action="/form_app/index" method="post">
{% csrf_token %}
<p>{{ obj.username }} {{ error_msg.username.0 }}</p>
<p>{{ obj.pwd }} {{ error_msg.pwd.0 }}</p>
<p>{{ obj.email }} {{ error_msg.email.0 }}</p>
<p>{{ obj.user }}</p>
<p><input type="submit" value="提交"></p>
</form> </body>
</html>

form_index.html

def index(request):
if request.method == 'GET':
# 加载默认值
initial_dic = {
'username': 'root',
'pwd': '',
'email': '953995648@qq.com',
'user': True
} obj = FM(initial_dic)
return render(request,'form_index.html',{'obj': obj})
elif request.method == 'POST':
# 获取用户所有数据
# 每条数据请求验证
# 成功:获取用户提交的数据
# 失败:显示错误信息
obj = FM(request.POST)
# 验证是否合法
ret = obj.is_valid()
if ret:
print('obj.clean****',obj.clean())
print('obj.clead_data*****',obj.cleaned_data)
else:
print('obj.errors****',obj.errors)
print('obj.errors.as_json()*****',obj.errors.as_json())
print('obj****',obj)
# from django.forms.utils import ErrorDict
# obj.errors为ErrorDict类型,所以应该按照字典的方法获取值
print(type(obj.errors))
return render(request,'form_index.html',{'obj': obj,'error_msg': obj.errors})

Views.py

在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

方式一:

from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator class MyForm(Form): user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
initial=2,
widget=widgets.Select
) def __init__(self, *args, **kwargs):
super(MyForm,self).__init__(*args, **kwargs)
# self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
# 或
self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')

方式二:

使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现

from django import forms
from django.forms import fields
from django.forms import widgets
from django.forms import models as form_model
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator class FInfo(forms.Form):
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())
# authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())

django基础篇05-Form验证组件的更多相关文章

  1. Django 进阶篇之 Form验证

    Django Form验证 在实际的生产环境中比如登录和验证的时候,我们一般都使用Jquery+ajax来判断用户的输入是否为空,假如JS被禁用的话,咱们这个认证屏障是不是就消失了呢?(虽然一般不会禁 ...

  2. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  3. day 64 Django基础十之Form和ModelForm组件

    Django基础十之Form和ModelForm组件   本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...

  4. 01: Django基础篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  5. iOS系列 基础篇 05 视图鼻祖 - UIView

    iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...

  6. Django基础十之Form和ModelForm组件

    一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...

  7. 12.Django基础十之Form和ModelForm组件

    一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...

  8. 01:django基础篇

    Django其他篇 目录: 1.1 django初探 1.2 第一个django项目 1.3 django render/redirect/HttpResponse 和 request.GET req ...

  9. Django学习系列之Form验证

    django表单基础 django表单分类 基于django.forms.Form:所有表单类的父类 基于django.forms.ModelForm:可以和模型类绑定的Form Form验证流程 定 ...

随机推荐

  1. 3D Computer Grapihcs Using OpenGL - 20 结合Buffer

    在上一节的案例中,我们使用了四个Buffer Object,立方体的VertexBuffer,立方体的索引Buffer,四面体的VertexBuffer,四面体的索引Buffer. 我们这节尝试把两个 ...

  2. cin.clear()、cin.sync()

    看机器学习时,发现之前学的C++代码忘了,cin.clear().cin.sync() cin.clear():将流中的所有状态值都重设为有效值 cin.sync():清空流 这个很有意思,如果没有c ...

  3. javascript 链式调用+构造函数

    前几天面试,有一个问题是使用构造函数实现链式调用,后面查看了一些简单的资料,整理一下 首先,先说一下JS 中构造函数和普通函数的区别,主要分为以下几点 1.构造函数也是一个普通函数,创建方式和普通函数 ...

  4. Mybatis 中在xxx.mapper书写模糊查询

    1.在mybatis中,书写sql,有时候会有一些不细心,如: <!-- 首页商品 关键字搜索--> <select id="getGoodsByLikeTitle&quo ...

  5. 14 补充 MySQL的创建用户和授权

    权限管理 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操作.那么一般情况在公司之后DBA工程师会创建一个 ...

  6. idea使用 git 撤销commit 原

    填写commit的id  就可以取消这一次的commit

  7. Chrome 抓包:快速定位HTTP协议问题

    标签(空格分隔): 快速定位HTTP协议问题 Chrome:快速定位HTTP协议问题 快捷键:control+shift+i(windows),command+option+i(mac) 控制器: 控 ...

  8. sklearn—无监督最近邻

    无监督最近邻 NearestNeighbors (最近邻)实现了 unsupervised nearest neighbors learning(无监督的最近邻学习). 它为三种不同的最近邻算法提供统 ...

  9. Html/CSS 示例演练 图书馆后台界面

    示例演练(html css javascript) --制作图书馆后台界面 1. 成品图

  10. Vue知识整理14:组件基础

    组件:可以复用的实例.使用 v-component来实现 2.通过props属性添加相应的属性,并且在模板中渲染 当模板中包含多个组件时,则需要用一个div来包裹起来.如下: 可以将原来的的点击事件, ...