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. [BZOJ2669][CQOI2012]局部极小值:DP+容斥原理

    分析 题目要求有且只有一些位置是局部极小值.有的限制很好处理,但是只有嘛,嗯...... 考虑子集反演(话说这个其实已经算是超集反演了吧还叫子集反演是不是有点不太合适),枚举题目给出位置集合的所有超集 ...

  2. Spring Boot教程(十二)整合elk(1)

    elk 简介 Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等. Logstash是 ...

  3. Hive数据导入Elasticsearch

    Elasticsearch Jar包准备 所有节点导入elasticsearch-hadoop-5.5.1.jar /opt/cloudera/parcels/CDH-5.12.0-1.cdh5.12 ...

  4. git本地分支推送到远程分支

    1.创建的创建和初始化 创建git仓库可以在远端创建一个仓库, 然后check到本地,在本地的文件里创建工程文件,然后提交 也可以将本地现有的工程和远端的空仓库关联 本地创建了一个工程 iOSDemo ...

  5. Flask基础以及Response三剑客

    Flask的特点: 优点:小而精.三方组件全    缺点: 性能相对较差   因为依赖三方组件所以在更新的时候难免不同步 基础模板 from flask import Flask app = Flas ...

  6. C#与Java覆盖问题

    C#继承类中如含有相同的方法,避免冲突使用new关键字.在不同对象中分别对应该方法.若使用override关键字则,基类中的方法被覆盖. 如需调用非覆盖的则使用base关键字. Java中的继承类方法 ...

  7. BigDecimal进行加减乘除计算

    以前大部分关于查询计算的逻辑是在sql语句中执行的,但是有时候会出现比较复杂的计算情况,需要我们在代码中进行计算,这个时候使用BigDecimal进行计算会很方便. BigDecimal num1 = ...

  8. Python3 多线程编程 threading模块

    性能自动化测试除了用jmeter还可以用python threading模块做 一.threading模块定义 Python 2.4中包含的较新的线程模块为线程提供了更强大的高级支持. 线程模块公开线 ...

  9. 5G的科普

    5G的科普 1. 通信起源公式 2. 5G在有线与无线的应用 主要在无线上的突破 因为有线也就是(电缆,光纤,双绞线)这些传输介质,特别是光纤,以及完全达到我们平时通信所需求的速率 那么瓶颈在哪?短板 ...

  10. python+selenium元素定位之XPath学习02

    XPath 语法 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. XML 实例文档 我们将在下面的例子中使用这个 ...