Python的Django框架中forms表单类的使用方法详解

Form

Form的验证思路

前端:form表单

后台:创建form类,当请求到来时,先匹配,匹配出正确和错误信息。

Django的Form验证实例

创建project,进行基础配置文件配置

settings.py

settings.py之csrf注销

__init__.py

urls.py

views.account.py:

from django.shortcuts import render,HttpResponse
from app01.forms import Form1def form1(request):if request.method=="POST":  #这里POST一定要大写#通常获取请求信息#request.POST.get("user",None)#request.POST.get("pwd",None)#获取请求内容,做验证f = Form1(request.POST)  #request.POST:将接收到的数据通过Form1验证if f.is_valid():  #验证请求的内容和Form1里面的是否验证通过。通过是True,否则False。print(f.cleaned_data)  #cleaned_data类型是字典,里面是提交成功后的信息else:  #错误信息包含是否为空,或者符合正则表达式的规则print(type(f.errors),f.errors)  #errors类型是ErrorDict,里面是ul,li标签return render(request,"account/form1.html",{"error":f.errors})return render(request,"account/form1.html")

html:

<body>
{#{{ error }}接收后台返回的错误信息封装在ul,li标签里面:#}{{ error }}<form action="/form1/" method="POST"><div><input type="text" name="user" /></div><div><input type="text" name="pwd" /></div><div><input type="submit" value="提交" /></div></form>
</body>

forms.py:

from django import formsclass Form1(forms.Form):user = forms.CharField()pwd = forms.CharField()

访问页面:

没有输入内容后提交,通过模板语言展示了错误信息

Django强大之form验证时不用自定义错误信息就可以返回错误信息到前端以标签方式展现。

.is_valid():返回True或者False

.cleaned_data:通过验证后的数据

errors:
.error.get("user",None)error封装所有的错误信息,如果没有获取到,默认为None。

如:

.error.get["pwd"]直接获取到ul、li。

如:

forms.py

from django import formsclass Form1(forms.Form):user = forms.CharField()pwd = forms.CharField()

HTML:

   <form action="/form1/" method="POST"><div class="input-group">{#接收后台传过来的form对象,自动生成input标签#}{{ form.user }}{#从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}{#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}{% if error.user.0 %}<span>{{ error.user.0 }}</span>{% endif %}</div><div class="input-group">{{ form.pwd }}{% if error.pwd.0 %}<span>{{ error.pwd.0 }}</span>{% endif %}</div><div><input type="submit" value="提交" /></div></form>

account.py

def form1(request):if request.method == "POST":f = Form1(request.POST)if f.is_valid():print(f.cleaned_data)else:return render(request,"account/form1.html",{"error":f.errors,"form":f})else:# 如果不是post提交数据,就不传参数创建对象,并将对象返回给前台,直接生成input标签,内容为空f = Form1()return render(request,"account/form1.html",{"form":f})return render(request,"account/form1.html")

注:

 页面展示:

注:这里的input标签是后端返回form对象到前端通过{{ form.xxx }}所创建的

更强大的功能:

 forms里面的字段:

required:是否可以为空。required=True 不可以为空,required=False 可以为空
max_length=4 最多4个值,超过不会显示
min_length=2 至少两个值,少于两个会返回提示信息
error_messages={'required': '邮箱不能为空', 'invalid': '邮箱格式错误'}  自定义错误信息,invalid 是格式错误
widget=forms.TextInput(attrs={'class': 'c1'}) 给自动生成的input标签自定义class属性
widget=forms.Textarea()  生成Textarea标签。widget默认生成input标签

实战:

models.py

from django.db import models# Create your models here.
class Author(models.Model):"""作者"""name = models.CharField(max_length=100)age = models.IntegerField()class BookType(models.Model):"""图书类型"""caption = models.CharField(max_length=64)class Book(models.Model):"""图书"""name = models.CharField(max_length=64)pages = models.IntegerField()price = models.DecimalField(max_digits=10,decimal_places=2)pubdate = models.DateField()authors = models.ManyToManyField(Author)book_type = models.ForeignKey(BookType)

forms.py:

from django import forms
from app01 import modelsclass Form1(forms.Form):user = forms.CharField(widget=forms.TextInput(attrs={'class': 'c1'}),error_messages={'required': '用户名不能为空'}, )pwd = forms.CharField(max_length=4, min_length=2,required=True)email = forms.EmailField(error_messages={'required': '邮箱不能为空', 'invalid': '邮箱格式错误'})memo = forms.CharField(widget=forms.Textarea())#直接写数据# user_type_choice = (#     (0, '普通用户'),#     (1, '高级用户'),# )#通过BookType表查询信息,values_list拿到的是元组。id作为value显示,caption作为text在页面显示# user_type_choice = models.BookType.objects.values_list('id', 'caption')# book_type = forms.CharField(#     widget=forms.widgets.Select(choices=user_type_choice, attrs={'class': "form-control"}))#写上以下代码就不用担心数据库添加了数据而不能及时获取了def __init__(self, *args, **kwargs):#每次创建Form1对象时执行init方法super(Form1, self).__init__(*args, **kwargs)self.fields['book_type'] = forms.CharField(widget=forms.widgets.Select(choices=models.BookType.objects.values_list('id', 'caption'),attrs={'class': "form-control"}))

HTML:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.input-group{position: relative;padding: 20px;width: 250px;}.input-group input{width: 200px;display: inline-block;}.inline-group span{display: inline-block;position: absolute;height: 12px;font-size: 8px;border: 1px solid red;background-color: coral;color: white;top: 41px;left: 20px;width: 202px;}</style>
</head>
<body><form action="/form1/" method="POST"><div class="input-group">
{#            接收后台传过来的form对象,自动生成input标签#}{{ form.user }}
{#            从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}
{#            如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}{% if error.user.0 %}<span>{{ error.user.0 }}</span>{% endif %}</div><div class="input-group">{{ form.pwd }}{% if error.pwd.0 %}<span>{{ error.pwd.0 }}</span>{% endif %}</div><div class="input-group">{{ form.email }}{% if error.email.0 %}<span>{{ error.email.0 }}</span>{% endif %}</div><div class="input-group">{{ form.memo }}{% if error.memo.0 %}<span>{{ error.memo.0 }}</span>{% endif %}</div><div class="input-group">{{ form.book_type }}{% if error.book_type.0 %}<span>{{ error.book_type.0 }}</span>{% endif %}</div><div><input type="submit" value="提交" /></div></form></body>
</html>

account.py:

from django.shortcuts import render,HttpResponse
from app01.forms import Form1
from app01.models import *# def test(req):
#     BookType.objects.create(caption='技术')
#     BookType.objects.create(caption='文学')
#     BookType.objects.create(caption='动漫')
#     BookType.objects.create(caption='男人装')
#     return HttpResponse("ok")def form1(request):if request.method == "POST":f = Form1(request.POST)if f.is_valid():print(f.cleaned_data)else:return render(request,"account/form1.html",{"error":f.errors,"form":f})else:# 如果不是post提交数据,就不传参数创建对象,并将对象返回给前台,直接生成input标签,内容为空f = Form1()return render(request,"account/form1.html",{"form":f})return render(request,"account/form1.html")

Django里面没有手机验证,没有的需要自定义

示例:

Form

View

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生动形象的理解API是如何工作的!

API(Application Programming Interface,应用程序编程接口) 简单来说&#xff0c;就是其他人开发出来一块程序&#xff0c;你想用&#xff0c;他会告诉你调用哪个函数&#xff0c;给这个函数传什么参数&#xff0c;然后又会返回给你一个什么样的结果&#xff0c;你不需要知道他…

echarts 柱状图 ,颜色和显示设置

最近在使用echart开发图标&#xff0c;api里面虽然有些设置&#xff0c;但是如果想让柱状图每个柱的颜色都不相同&#xff0c;简单的通过color设置是没有作用的&#xff0c;这里&#xff0c;就要用到其他的方式了 下面只是列举下我认为比较常用的&#xff0c;其他的比较简单&am…

Pycharm 专业版 导入系统pip安装的包

Pycharm 专业版 导入系统pip安装的包 在setting 中找到project interpeter ,点击设置图标&#xff0c;点击Add&#xff0c;得到如图所示选择 System Interpreter即可,这样 用pip安装的包都加再进来了

nodejs express

2019独角兽企业重金招聘Python工程师标准>>> 创建express服务器 //app.js文件 var express require(express); var app express(); //指定更目录显示的内容 app.get(/, function(req, res){ res.send(Hello World); }); //指定监听端口 var server app.listen(…

DuangDuangDuang!码云项目的 Readme.md 特殊技能

为什么80%的码农都做不了架构师&#xff1f;>>> 我们在 码云 上创建新项目的时候&#xff0c;常常会看到默认使用 README 文件初始化该项目&#xff08;如图1 所示&#xff09;&#xff0c;然后在新建项目的根目录下就会生成一个 README.md 文件&#xff08;如图2 …

Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

谷歌浏览器报错 版本 73.0.3683.103&#xff08;正式版本&#xff09; &#xff08;32 位&#xff09;报错内容如下Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.jquery.js:2 Cross-Origin Read Blocking (CORB) blocked cros…

解决Django静态文件配置pycharm高光问题

就困扰了我半天的Django静态文件配置问题 更改了setting 文件后 文件参考问题总会高亮让然觉得又错误怪怪的 所以索性直接眼不见心不烦 具体操作如下图&#xff1a; 就这样就可以啦 大功告成&#xff01; 也顺便提一下静态文件配置问题&#xff1a; Django静态加载的设置…

python神经网络可视化,python中的神经网络感受野可视化

这是我想出的解决方案。谢谢mprat的帮助。在我发现spectralcolormap最适合这种任务&#xff0c;而且我还添加了您可以指定的边框。在from matplotlib import pyplotimport numpy as npborder 2images_amount 300row_amount 10col_amount 30image_height 28image_width 28…

Qt 多媒体音频模拟按钮发音(音视频启动)

## 项目演示 平台:windows或者ubuntu 要求:平台需要支持音频播放功能 文件格式:.wav 可以使用剪映生成,音频部分,我这里是简短的音乐 # Qt 多媒体简介 Qt QSound是Qt框架中的一个类,用于播放音频文件。它可以在Qt应用程序中实现简单的音频播放功能,包括播放、暂停和…

ASP.NET MVC5 ModelBinder

什么是ModelBinding ASP.NET MVC中&#xff0c;所有的请求最终都会到达某个Controller中的某个Action并由该Action负责具体的处理和响应。为了能够正确处理请求&#xff0c;Action的参数&#xff08;如果有的话&#xff09;&#xff0c;必须在Action执行之前&#xff0c;根据相…

php在html里面的位置,关于script在html中的摆放位置解析

以前一直觉得script在html中的任何位置都可以&#xff0c;今天做一个需求的时候才更正了自己的错误思想啊--script的位置也不是随便放的。本文主要谈论关于script在html中的摆放位置。小编觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。希望能帮助到…

Protocol Buffer技术详解(C++实例)

原文&#xff1a;http://www.cnblogs.com/stephen-liu74/archive/2013/01/04/2842533.html 这篇Blog仍然是以Google的官方文档为主线&#xff0c;代码实例则完全取自于我们正在开发的一个Demo项目&#xff0c;通过前一段时间的尝试&#xff0c;感觉这种结合的方式比较有利于培训…

CentOS远程监控

近日&#xff0c;因工作需要&#xff0c;学习了CentOS远程监控的水平有限&#xff0c;多指教。 远程访问CentOS&#xff0c;包括三种方式ssh&#xff0c;telnet&#xff0c;vnc。 本例涉及的是以vnc远程访问CentOS。指令在root下操作。注意&#xff1a;vnc的端口为5900&#xf…

BGP路由协议详解(完整篇)

原文链接&#xff1a;http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上个月我写一篇关于BGP协议的博文&#xff0c;曾许诺过要完善这个文档&#xff0c;但因最近的工作和授课很忙&#xff0c;所以没有时间进行完善。为了实现这个承诺&#xff0c;我在去外…

GitHub+Hexo搭建自己的Blog之-本地环境部署01

前言 之前我的博客没有绑自己的域名&#xff0c;一直在github上放着&#xff0c;访问起来比较麻烦&#xff0c;前阵子在阿里云买了这个域名&#xff0c;配置上之后&#xff0c;就可以通过自己的域名访问了&#xff0c;有些朋友问我这个博客怎么搭的&#xff0c;用的什么主题&am…

使用VS2010编译Qt 5.6.1过程记录

由于Qt官方发布的Qt 5.6.1二进制安装包没有对应VS2010版本的&#xff0c;而我的电脑上只安装了VS2010&#xff0c;因此只能自己编译。 本文记录本人的编译安装过程&#xff0c;以及其中遇到的一些问题。 本文使用VS2010 32位编译Qt 5.6.1。 1. 下载Qt源代码 Qt源代码下载地址&…

Windows安装Apache注册服务出现(OS 5)拒绝访问。 : AH00369: Failed to open the Windows service manager,

windows安装Apache&#xff0c;注册服务出现“(OS 5)拒绝访问。 : AH00369: Failed to open the WinNT service manager..."错误 在安装Apache的时候&#xff0c;我下载的是zip格式&#xff0c;不是msi安装版&#xff0c;需要自己注册服务&#xff0c;才能在桌面任务栏里有…

算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作&#xff0c;并且还聊了栈与队列的相关内容。本篇博客我们就继续聊数据结构的相关东西&#xff0c;并且所涉及的相关Demo依然使用面向对象语言Swift来表示。本篇博客我们就来介绍树结构的一种&#xff1a;二叉树。在…

linux替换某个文件夹下所有文件,Linux 批量查找并替换文件夹下所有文件的内容...

1.批量查找某个目下文件的包含的内容cd etcgrep -rn "查找的内容" ./2.批量替换某个目下所有包含的文件的内容cd etcsed -i "s/查找的内容/替换后的内容/g" grep -rl "查找的内容" ./3.批量查找并替换任意文件夹下的文件内容。sed -i "s/要…

java中String相等问题

判断两个字符串是否相等的问题。在编程中&#xff0c;通常比较两个字符串是否相同的表达式是“”,但在java中不能这么写。在java中&#xff0c;用的是equals(); 例&#xff1a;A字符串和B和字符串比较: if(A.equals(B)){ } 返回true 或false. String 的equals 方法用于比较两个…