django基础篇05-Form验证组件
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验证组件的更多相关文章
- Django 进阶篇之 Form验证
Django Form验证 在实际的生产环境中比如登录和验证的时候,我们一般都使用Jquery+ajax来判断用户的输入是否为空,假如JS被禁用的话,咱们这个认证屏障是不是就消失了呢?(虽然一般不会禁 ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- day 64 Django基础十之Form和ModelForm组件
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...
- 01: Django基础篇
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- iOS系列 基础篇 05 视图鼻祖 - UIView
iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...
- Django基础十之Form和ModelForm组件
一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...
- 12.Django基础十之Form和ModelForm组件
一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...
- 01:django基础篇
Django其他篇 目录: 1.1 django初探 1.2 第一个django项目 1.3 django render/redirect/HttpResponse 和 request.GET req ...
- Django学习系列之Form验证
django表单基础 django表单分类 基于django.forms.Form:所有表单类的父类 基于django.forms.ModelForm:可以和模型类绑定的Form Form验证流程 定 ...
随机推荐
- VS Code报错Module 'xx' has no 'xx' member pylint(no-member)解决办法
pylint是vscode的python语法检查器,pylint是静态检查,在用第三方库的时候有些成员只有在运行代码的时候才会被建立,它就找不到成员,在设置(settings.json)里添加 &qu ...
- CodeChef---- February Challenge 2018----Chef and odd queries(复杂度分块计算)
链接 https://www.codechef.com/FEB18/problems/CHANOQ/ Chef and odd queries Problem Code: CHANOQ Chef ...
- [LeetCode]-DataBase-Nth Highest Salary
Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...
- WebView:是应用程序打开web网页的UI控件后端
public class WebViewActivity extends Activity { private WebView webView; @Override protected void on ...
- 通过jvm 查看死锁
jstack -l jvm_pid 运行以下代码之后运行上面命令,可以在控制台上看到死锁. public class DeadLock { public static String obj1 = &q ...
- Getting CFNetwork SSLHandshake failed (-9806) error
平常个人打测试包一切OK,今天突然不能联网了 How to handle "CFNetwork SSLHandshake failed" in iOS 参考1 Getting CF ...
- js 放回上一页
window.history.go(-1);//返回上一页不刷新 window.location.href = document.referrer;//返回上一页并刷新
- web编辑器的快捷键
alt 键:可以同时选中多个光标 .box 按住 tab 键 可以快速的 <div class="box"></div> #box 按住 tab 键 可以快 ...
- CANopen的相关学习
CANopen是一种架构在控制局域网路(Controller Area Network, CAN)上的高层通讯协定,包括通讯子协定及设备子协定常在嵌入式系统中使用,也是工业控制常用到的一种现场总线. ...
- Vue项目移动端滚动穿透问题
概述 今天在做 Vue 移动端项目的时候遇到了滚动穿透问题,在网上查资料后,选取了我觉得最好的方法,记录下来供以后开发时参考,相信对其他人也有用. 上层无需滚动 如果上层无需滚动的话,直接屏蔽上层的 ...