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. Nginx的正则表达式

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Ра ...

  2. 2019 南京网络赛A

    南京网络赛自闭现场 https://nanti.jisuanke.com/t/41298 二维偏序经典题型 二维前缀和!!! #include<bits/stdc++.h> using n ...

  3. 【Python】Python读取文件报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 20: illegal multibyte sequence

    环境描述 text.txt 今天的天气不错 是个皻的选择 读取文件的代码 #!/usr/bin/python #-*- coding:UTF-8 -*- f = open(r'D:\Python\Py ...

  4. Java中参数的引用传递和值传递

    1.一些定义 值传递:把实际传入参数的值,在内存中赋值一份 引用传递:传入的是实际参数的地址 2.传递基本类型的参数 因为Java是值传递,那就不难理解下面的代码不交换任何值 swap(Type ar ...

  5. Ubuntu 12.04输入密码登陆后又跳回到登录界面

    先找到这个文件: /home/user/.xsession-errors 打开这个文件.   这个文件记录了系统启动的日志,从这里你就可以看到启动的时候哪里出了问题. 对于我的来说,问题出在这里: & ...

  6. 3、Shiro授权

    Shiro授权过程和认证过程相似: 项目结构: package com.shiro.shiroframe; import org.apache.shiro.SecurityUtils; import ...

  7. Unity3D(C#)连接SQL Server2008

    首先部署安装sql server2008,添加Sql Manager. Unity3D连接需要在Unity2017\Editor\Data\Mono\lib\mono\unity文件下找到4个头文件l ...

  8. Unity Mathf And Transform Compent(一)

    Mathf类部分变量 辐射到度的转化函数,能够将弧度转化成度. Abs 能够求出绝对值 Atan 求出正切值x/y的弧度 Transform 组件中带有local 以父物体为坐标原点 global以世 ...

  9. TCP中SYN洪水攻击

    在查看TCP标识位SYN时,顺便关注了一下SYN Flood,从网上查阅一些资料加以整理,SYN洪水攻击利用TCP三次握手. 1.SYN洪水介绍 当一个系统(客户端C)尝试和一个提供了服务的系统(服务 ...

  10. eslint 修改规则 函数形参不使用报错

    函数再定义形参以后未使用就会出现报错的问题,需要设置一项eslint 规则 再.eslintrc.js   rules里面添加 "no-unused-vars": "of ...