当前位置: 首页 > news >正文

Django高级之-forms组件

Django高级之-forms组件

1 校验字段功能

针对一个实例:注册用户讲解。

模型:models.py

class UserInfo(models.Model):name=models.CharField(max_length=32)pwd=models.CharField(max_length=32)email=models.EmailField()

模版文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title></head>
<body><form action="" method="post">{% csrf_token %}<div><label for="user">用户名</label><p><input type="text" name="name" id="name"></p></div><div><label for="pwd">密码</label><p><input type="password" name="pwd" id="pwd"></p></div><div><label for="r_pwd">确认密码</label><p><input type="password" name="r_pwd" id="r_pwd"></p></div><div><label for="email">邮箱</label><p><input type="text" name="email" id="email"></p></div><input type="submit">
</form></body>
</html>

视图函数:

# forms组件
from django.forms import widgetswid_01=widgets.TextInput(attrs={"class":"form-control"})
wid_02=widgets.PasswordInput(attrs={"class":"form-control"})class UserForm(forms.Form):name=forms.CharField(max_length=32,widget=wid_01)pwd=forms.CharField(max_length=32,widget=wid_02)r_pwd=forms.CharField(max_length=32,widget=wid_02)email=forms.EmailField(widget=wid_01)tel=forms.CharField(max_length=32,widget=wid_01)def register(request):if request.method=="POST":form=UserForm(request.POST)if form.is_valid():print(form.cleaned_data)       # 所有干净的字段以及对应的值else:print(form.cleaned_data)       #print(form.errors)             # ErrorDict : {"校验错误的字段":["错误信息",]}print(form.errors.get("name")) # ErrorList ["错误信息",]return HttpResponse("OK")form=UserForm()return render(request,"register.html",locals())

2 渲染标签功能

渲染方式1

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!-- 最新版本的 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<h3>注册页面</h3>
<div class="container"><div class="row"><div class="col-md-6 col-lg-offset-3"><form action="" method="post">{% csrf_token %}<div><label for="">用户名</label>{{ form.name }}</div><div><label for="">密码</label>{{ form.pwd }}</div><div><label for="">确认密码</label>{{ form.r_pwd }}</div><div><label for=""> 邮箱</label>{{ form.email }}</div><input type="submit" class="btn btn-default pull-right"></form></div></div>
</div></body>
</html>

渲染方式2

<form action="" method="post">{% csrf_token %}{% for field in form %}<div><label for="">{{ field.label }}</label>{{ field }}</div>{% endfor %}<input type="submit" class="btn btn-default pull-right"></form>

渲染方式3

<form action="" method="post">{% csrf_token %}{{ form.as_p }}<input type="submit" class="btn btn-default pull-right"></form>

3 渲染错误信息功能

视图

def register(request):if request.method=="POST":form=UserForm(request.POST)if form.is_valid():print(form.cleaned_data)       # 所有干净的字段以及对应的值else:print(form.cleaned_data)       #print(form.errors)             # ErrorDict : {"校验错误的字段":["错误信息",]}print(form.errors.get("name")) # ErrorList ["错误信息",]return render(request,"register.html",locals())form=UserForm()return render(request,"register.html",locals())

模板

<form action="" method="post" novalidate>{% csrf_token %}{% for field in form %}<div><label for="">{{ field.label }}</label>{{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span></div>{% endfor %}<input type="submit" class="btn btn-default"></form>

4 组件的参数配置

class Ret(Form):name = forms.CharField(max_length=10, min_length=2, label='用户名',error_messages={'required': '该字段不能为空', 'invalid': '格式错误', 'max_length': '太长','min_length': '太短'},widget=widgets.TextInput(attrs={'class':'form-control'}))pwd = forms.CharField(max_length=10, min_length=2, widget=widgets.PasswordInput(attrs={'class':'form-control'}))email = forms.EmailField(label='邮箱', error_messages={'required': '该字段不能为空', 'invalid': '格式错误'})

5 局部钩子

from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
def clean_name(self):val=self.cleaned_data.get("name")ret=UserInfo.objects.filter(name=val)if not ret:return valelse:raise ValidationError("该用户已注册!")def clean_tel(self):val=self.cleaned_data.get("tel")if len(val)==11:return valelse:raise  ValidationError("手机号格式错误")

6 全局钩子

def clean(self):pwd=self.cleaned_data.get('pwd')r_pwd=self.cleaned_data.get('r_pwd')if pwd and r_pwd:if pwd==r_pwd:return self.cleaned_dataelse:raise ValidationError('两次密码不一致')else:return self.cleaned_data
pwd_err=my_form.errors.get('__all__')
from django import formsfrom django.forms import widgets
from app01.models import UserInfofrom django.core.exceptions import NON_FIELD_ERRORS, ValidationErrorclass UserForm(forms.Form):name=forms.CharField(min_length=4,label="用户名",error_messages={"required":"该字段不能为空"},widget=widgets.TextInput(attrs={"class":"form-control"}))pwd=forms.CharField(min_length=4,label="密码",widget=widgets.PasswordInput(attrs={"class":"form-control"}))r_pwd=forms.CharField(min_length=4,label="确认密码",error_messages={"required":"该字段不能为空"},widget=widgets.TextInput(attrs={"class":"form-control"}))email=forms.EmailField(label="邮箱",error_messages={"required":"该字段不能为空","invalid":"格式错误"},widget=widgets.TextInput(attrs={"class":"form-control"}))tel=forms.CharField(label="手机号",widget=widgets.TextInput(attrs={"class":"form-control"}))def clean_name(self):val=self.cleaned_data.get("name")ret=UserInfo.objects.filter(name=val)if not ret:return valelse:raise ValidationError("该用户已注册!")def clean_tel(self):val=self.cleaned_data.get("tel")if len(val)==11:return valelse:raise  ValidationError("手机号格式错误")def clean(self):pwd=self.cleaned_data.get('pwd')r_pwd=self.cleaned_data.get('r_pwd')if pwd and r_pwd:if pwd==r_pwd:return self.cleaned_dataelse:raise ValidationError('两次密码不一致')else:return self.cleaned_data
from django.shortcuts import render,HttpResponsefrom app01.myforms import *def reg(request):if request.method=="POST":print(request.POST)#form=UserForm({"name":"yu","email":"123@qq.com","xxxx":"alex"})form=UserForm(request.POST) # form表单的name属性值应该与forms组件字段名称一致print(form.is_valid()) # 返回布尔值if form.is_valid():print(form.cleaned_data)  # {"name":"yuan","email":"123@qq.com"}else:print(form.cleaned_data)  # {"email":"123@qq.com"}# print(form.errors)        # {"name":[".........."]}# print(type(form.errors))  # ErrorDict# print(form.errors.get("name"))# print(type(form.errors.get("name")))    # ErrorList# print(form.errors.get("name")[0])#   全局钩子错误#print("error",form.errors.get("__all__")[0])errors=form.errors.get("__all__")return render(request,"reg.html",locals())'''form.is_valid()   :返回布尔值form.cleaned_data :{"name":"yuan","email":"123@qq.com"}form.errors       :{"name":[".........."]}'''form=UserForm()return render(request,"reg.html",locals())
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.error{color: red;}</style><!-- 最新版本的 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body><div class="container"><div class="row"><div class="col-md-6 col-lg-offset-3">{#<h3>简单form</h3>#}{##}{##}{#<form action="" method="post" novalidate>#}{#    {% csrf_token %}#}{#    <p>用户名<input type="text" name="name"></p>#}{#    <p>密码 <input type="text" name="pwd"></p>#}{#    <p>确认密码 <input type="text" name="r_pwd"></p>#}{#    <p>邮箱  <input type="text" name="email"></p>#}{#    <p>手机号 <input type="text" name="tel"></p>#}{#    <input type="submit">#}{##}{#</form>#}<hr><h3>forms组件渲染方式1</h3><form action="" method="post" novalidate>{% csrf_token %}<p>{{ form.name.label }}{{ form.name }} <span class="pull-right error">{{ form.name.errors.0 }}</span></p><p>{{ form.pwd.label }}{{ form.pwd }} <span class="pull-right error">{{ form.pwd.errors.0 }}</span></p><p>确认密码{{ form.r_pwd }} <span class="pull-right error">{{ form.r_pwd.errors.0 }}</span><span class="pull-right error">{{ errors.0 }}</span></p><p>邮箱 {{ form.email }} <span class="pull-right error">{{ form.email.errors.0 }}</span></p><p>手机号 {{ form.tel }} <span class="pull-right error">{{ form.tel.errors.0 }}</span></p><input type="submit"></form>{#<h3>forms组件渲染方式2</h3>#}{##}{#<form action="" method="post" novalidate>#}{#     {% csrf_token %}#}{##}{#    {% for field in form %}#}{##}{#        <div>#}{#            <label for="">{{ field.label }}</label>#}{#            {{ field }}#}{#        </div>#}{##}{#    {% endfor %}#}{##}{#     <input type="submit">#}{#</form>#}{##}{#<h3>forms组件渲染方式3</h3>#}{##}{#<form action="" method="post">#}{#     {% csrf_token %}#}{##}{#     {{ form.as_p }}#}{##}{#     <input type="submit">#}{#</form>#}</div></div>
</div></body>
</html>

         

相关文章:

Django高级之-forms组件

Django高级之-forms组件 1 校验字段功能 针对一个实例&#xff1a;注册用户讲解。 模型&#xff1a;models.py class UserInfo(models.Model):namemodels.CharField(max_length32)pwdmodels.CharField(max_length32)emailmodels.EmailField()模版文件 <!DOCTYPE html&g…...

GPT实战系列-LangChain实现简单链

GPT实战系列-LangChain实现简单链 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT实战系…...

关于tomcat服务器配置及性能优化的20道高级面试题

1. 请描述Tomcat服务器的基本架构和组件。 Tomcat服务器的基本架构主要包括Server、Service、Connector和Container等组件。具体来看&#xff1a; Server&#xff1a;是Tomcat中最顶层的容器&#xff0c;代表着整个服务器。它负责运行Tomcat服务器&#xff0c;例如打开和关闭…...

LeetCode 1315.祖父节点值为偶数的节点和

给你一棵二叉树&#xff0c;请你返回满足以下条件的所有节点的值之和&#xff1a; 该节点的祖父节点的值为偶数。&#xff08;一个节点的祖父节点是指该节点的父节点的父节点。&#xff09; 如果不存在祖父节点值为偶数的节点&#xff0c;那么返回 0 。 示例&#xff1a; 输入…...

C语言分支和循环总结

文章目录 概要结构介绍不同结构的语句简单运用小结 概要 C语言中分为三种结构&#xff1a;顺序结构&#xff0c;选择结构&#xff0c;循环结构 结构介绍 顺序结构就是从上到下&#xff0c;从左到右等等&#xff1b;选择结构可以想象是Y字路口就是到了一个地方会有不同的道路…...

【Echarts】曲线图上方显示数字以及自定义值,标题和副标题居中,鼠标上显示信息以及自定义信息

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《前端》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…...

双环PID控制详细讲解

参考博客&#xff1a; &#xff08;1&#xff09;PID双环控制&#xff08;速度环和位置环&#xff09; &#xff08;2&#xff09;PID控制&#xff08;四&#xff09;&#xff08;单环与双环PID&#xff09; &#xff08;3&#xff09;内外双环pid算法 0 单环PID 目标位置→系…...

深入解析Java内存模型

一、背景 并发编程本质问题是&#xff1a;CPU、内存以及IO三者之间的速度差异。CPU速度快于内存、内存访问速度又远远快于IO&#xff0c;根据木桶理论&#xff0c;程序性能取决于最慢的操作&#xff0c;即IO操作。这样会出现CPU和内存交互时&#xff0c;CPU性能无法被充分利用…...

python使用国内镜像源

使用格式 格式为&#xff1a;pip install 库名 -i 镜像地址&#xff08;注意空格的存在&#xff09; pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple 推荐的镜像源&#xff1a; 清华大学&#xff08;推荐&#xff09;&#xff1a;https://pypi.tuna.tsing…...

【动态规划】代码随想录算法训练营第四十六天 |139.单词拆分,关于多重背包,你该了解这些! ,背包问题总结篇!(待补充)

139.单词拆分 1、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词…...

WordPress建站入门教程:如何选择和设置固定链接结构?

我们成功搭建好WordPress网站后&#xff0c;发布的文章对应的URL地址默认是使用“日期和名称型”&#xff0c;即是网站域名跟着的是年月日&#xff0c;最后是文章标题&#xff0c;如http://www.yigujin.com/2024/03/06/免费响应式WordPress博客主题JianYue/ 为了让我们的文章U…...

一款好用的AI工具——边界AICHAT(三)

目录 3.23、文档生成PPT演示3.24、AI文档翻译3.25、AI翻译3.26、论文模式3.27、文章批改3.28、文章纠正3.29、写作助手3.30、文言文翻译3.31、日报周报月报生成器3.32、OCR-DOC办公文档识别3.33、AI真人语音合成3.34、录音音频总结3.35、域方模型市场3.36、模型创建3.37、社区交…...

编程示例: 矩阵的多项式计算以javascript语言为例

编程示例: 矩阵的多项式计算以javascript语言为例 国防工业出版社的《矩阵理论》一书中第一章第8个习题 试计算2*A^8-3*A^5A^4A^2-4I A[[1,0,2],[0,-1,1],[0,1,0]] 代码如下 <html> <head> <title> 矩阵乘法 </title> <script srcset.js ><…...

project generator 简单使用

文章目录 1 progen 资源2 使用简介2.1 安装2.2 添加 target&#xff08;可选&#xff09;2.3 替换 CMake 模板&#xff08;可选&#xff09;2.4 创建 progen 项目 3 总结 1 progen 资源 0&#xff09;简介&#xff1a;progen&#xff08;project-generator&#xff0c;项目生成…...

C语言 —— 图形打印

题目1&#xff1a; 思路&#xff1a; 如果我们要打印一个实心正方形&#xff0c;其实就是一个二维数组&#xff0c;i控制行&#xff0c;j控制列&#xff0c;行列不需要控制&#xff0c;arr[i][j]直接打印星号即可。 对于空心正方形&#xff0c;我们只需要控制行和列的条件&…...

Python基础学习(11)常用模块

文章目录 一、time二、random三、os四、sys五、json补充1&#xff1a;JSON字符串补充2&#xff1a;JSON字符串和字典的区别 六、hashlib Python基础学习(1)基本知识 Python基础学习(2)序列类型方法与数据类型转换 Python基础学习(3)进阶字符串(格式化输出) Python基础学习(4)散…...

嵌入式学习37-TCP并发模型

TCP并发模型: 1.TCP多线程模型: 缺点: 1.创建线程会带来 资源开销 2.能够实现的 并发量 比较有限 2.IO模型: 1.阻塞IO: 没有…...

C语言字符函数和字符串函数

前言 今天这篇博客咱们一起来认识一些特殊的函数&#xff0c;在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便字符和字符串&#xff0c;C语言提供了一些库函数&#xff0c;让我们一起看看这些函数都有什么功能吧&#xff01;&#xff01;&#xff0…...

Go语言必知必会100问题-22 空切片与nil切片有区别吗?

空切片与nil切片有区别吗&#xff1f; 很多开发人员经常混淆nil切片和空切片,不清楚什么时候使用空切片什么时候使用nil&#xff0c;而有些库函数又对这两者使用进行了区分。下面先来看看它们的定义。 空切片是length为0的切片当切片等于nil时为nil切片 下面是几种不同空切片…...

【C++进阶】C++多态概念详解

C多态概念详解 一&#xff0c;多态概念二&#xff0c;多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写&#xff08;覆盖&#xff09;和重定义&#xff08;隐藏&#xff09;的区别 三&#xff0c;抽象…...

即时通讯安全篇(十六):对称加密 vs 非对称加密?一文搞懂

本文由vivo 互联网服务器团队Deng Qian分享&#xff0c;有排版和内容优化。 1、引言 在了解加密原理前&#xff0c;我们来看看这样一个故事&#xff1a; 小红和小明是情侣&#xff0c;一天&#xff0c;小红给小明发短信说&#xff1a;“亲爱的&#xff0c;我银行卡上没有钱了…...

告别手动分析!用Frida-Trace一键追踪Android App的JNI函数调用(附实战APK)

高效追踪JNI函数&#xff1a;Frida-Trace在Android逆向工程中的实战应用 逆向工程师和安全研究员们常常需要面对一个现实问题&#xff1a;如何在有限的时间内快速理解一个未知Android应用的Native层行为&#xff1f;传统方法往往需要手动分析so文件、设置断点、逐行跟踪&#…...

别再手动改后缀了!QGIS 3.28 保姆级教程:5分钟搞定CSV/TXT/JSON数据转SHP矢量图层

别再手动改后缀了&#xff01;QGIS 3.28 保姆级教程&#xff1a;5分钟搞定CSV/TXT/JSON数据转SHP矢量图层 每次看到同事对着文件右键重命名&#xff0c;把.xlsx改成.csv的时候&#xff0c;我的GIS从业者DNA都会颤抖一下——这种"暴力转换"不仅可能损坏数据&#xff0…...

URDF避坑指南:如何用SolidWorks导出模型并优化ROS仿真效果

URDF工业级建模实战&#xff1a;从SolidWorks到Gazebo仿真的全流程优化 在机器人开发领域&#xff0c;URDF&#xff08;统一机器人描述格式&#xff09;作为ROS生态中的标准建模语言&#xff0c;承担着连接机械设计与算法仿真的关键桥梁作用。然而&#xff0c;当开发者从基础UR…...

Arduino-Pico终极安装教程:从Arduino IDE到PlatformIO的完整配置

Arduino-Pico终极安装教程&#xff1a;从Arduino IDE到PlatformIO的完整配置 【免费下载链接】arduino-pico Raspberry Pi Pico Arduino core, for all RP2040 and RP2350 boards 项目地址: https://gitcode.com/gh_mirrors/ar/arduino-pico Arduino-Pico是一款针对Rasp…...

Qwen3-TTS-VoiceDesign效果展示:会议纪要自动转语音+重点语句强调合成

Qwen3-TTS-VoiceDesign效果展示&#xff1a;会议纪要自动转语音重点语句强调合成 获取更多AI镜像 想探索更多AI镜像和应用场景&#xff1f;访问 CSDN星图镜像广场&#xff0c;提供丰富的预置镜像&#xff0c;覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&#xff0…...

零基础掌握IP地址定位技术 - 提升开发效率90%

零基础掌握IP地址定位技术 - 提升开发效率90% 【免费下载链接】ip2region PHP版本的离线IP地址定位库 项目地址: https://gitcode.com/gh_mirrors/ip2/ip2region 在数字化时代&#xff0c;IP地址定位技术已成为众多应用的基础能力。无论是电商平台的物流优化、社交应用的…...

TranslucentTB:Windows任务栏个性化的轻量高效解决方案

TranslucentTB&#xff1a;Windows任务栏个性化的轻量高效解决方案 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 在当今数字化办公与娱…...

RexUniNLU部署教程:基于ModelScope的轻量级NLU框架一键启动指南

RexUniNLU部署教程&#xff1a;基于ModelScope的轻量级NLU框架一键启动指南 无需标注数据&#xff0c;定义即识别&#xff1a;用最简单的标签定义实现智能对话理解 1. 快速了解RexUniNLU 你是否遇到过这样的困扰&#xff1a;想要做一个智能对话系统&#xff0c;却苦于没有标注…...

Ostrakon-VL像素特工部署实战:Python入门者的3步环境搭建指南

Ostrakon-VL像素特工部署实战&#xff1a;Python入门者的3步环境搭建指南 1. 为什么选择Ostrakon-VL 如果你刚接触Python又想尝试AI图像处理&#xff0c;Ostrakon-VL是个不错的起点。这个模型特别适合处理图像扫描和基础视觉任务&#xff0c;对硬件要求不高&#xff0c;部署过…...