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>

         

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

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

相关文章

【死磕Elasticsearch】从实战中来,到实战中去

文章目录 写在前面&#xff1a;1、索引阻塞的种类2、什么时候使用阻塞&#xff1f;场景1&#xff1a;进行系统维护场景。场景2&#xff1a;保护数据不被随意更改场景。场景3&#xff1a;优化资源使用的场景。场景4&#xff1a;遵守安全规则场景。 3、添加索引阻塞API4、解除设置…

HarmonyOS预览功能报错:[webpack-cli] SyntaxError: Unexpected end of JSON input

harmonyos预览功能报错 在使用DevEco Studio写页面&#xff0c;进行预览的时候报错&#xff1a; [Compile Result] [webpack-cli] SyntaxError: Unexpected end of JSON input [Compile Result] at JSON.parse (<anonymous>) [Compile Result] at updateCached…

力扣由浅至深 每日一题.04 最长公共前缀

希望我们都能对抗生活的苦难&#xff0c;在乌云周围突破阴霾积极的生活 —— 24.3.12 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower…

psutil, 一个超级有用的Python库

Python的psutil是一个跨平台的库&#xff0c;可以用于获取系统运行时的各种信息&#xff0c;包括CPU使用率、内存使用情况、磁盘和网络信息等。它主要用来做系统监控&#xff0c;性能分析&#xff0c;进程管理。它实现了同等命令行工具提供的功能&#xff0c;如ps、top、lsof、…

20240312-2-贪心算法

贪心算法 是每次只考虑当前最优&#xff0c;目标证明每次是考虑当前最优能够达到局部最优&#xff0c;这就是贪心的思想&#xff0c;一般情况下贪心和排序一起出现&#xff0c;都是先根据条件进行排序&#xff0c;之后基于贪心策略得到最优结果。 面试的时候面试官一般不会出贪…

2024-3-12尾盘一致转分歧

安彩高科开一字符合预期&#xff0c;昨天风光储锂电大涨&#xff0c;理应给大溢价&#xff0c;超预期是 艾艾精工 高开秒板&#xff0c;立航科技高开分歧反核承接良好回封一致&#xff0c;带动了低空经济板块高潮&#xff0c;低空经济开始往 碳纤维 方向扩散。盘中我说了 三晖…

Neo4j 批量导入数据 从官方文档学习LOAD CSV 命令 小白可食用版

学习LOAD CSV&#x1f680; 在使用Neo4j进行大量数据导入的时候&#xff0c;发现如果用代码自动一行一行的导入效率过低&#xff0c;因此明白了为什么需要用到批量导入功能&#xff0c;在Neo4j中允许批量导入CSV文件格式&#xff0c;刚开始从网上的中看了各种半残的博客或者视频…

pytest测试框架使用基础07 fixture—parametrize获取参数的几种常用形式

【pytest】parametrize获取参数的几种常用形式: a.数据结构 b.文件 c.数据库 d.conftest.py配置一、直接在标签上传参 1.1 一个参数多个值 pytest.mark.parametrize("参数", (参数值1, 参数值2, 参数值3))示例&#xff1a; import pytest # 单个参数的情况 pytest.…

每日OJ题_牛客另类加法_力扣不用加号的加法

目录 另类加法 不用加号的加法 另类加法 另类加法__牛客网 class UnusualAdd {public:int addAB(int A, int B) {while (B ! 0) {int C ((B & A) << 1); // 进位A ^ B; // 无进位相加B C; // 直到进位不为0就跳出循环}return A;} };不用加号的加法 面试题 17.0…

C++鸟瞰(个人心得)

头文件 C和C一样&#xff0c;在源文件的头部需要加入头文件&#xff0c;来告诉预处理器你需要用到什么库。编写方式也和C语言一样&#xff0c;不过基础头文件不是stdlib.h而是iostream&#xff0c;名字划分为io和stream。 stream翻译过来就是“流”的概念&#xff0c;流的概念…

WebSocket:实现客户端与服务器实时通信的技术

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

3、Design Script之对象类型

布尔值 布尔值Boolean——true/false是Design Script的常量对象&#xff0c;用于表示真/假值 boolTrue true; boolFalse false&#xff1b; 在数字环境中&#xff0c;布尔值的行为类似于整数0和1 布尔值也可以作为Yes和No来引用 数字 int(integer)——整数 Double&#…

JS的对象

目录 对象&#xff1a;object 对象的创建&#xff1a; 利用对象字面量创建对象&#xff1a; 使用new来进行创建对象&#xff1a; 利用构造函数来创建对象&#xff1a; new的执行&#xff1a; 对象属性的遍历&#xff1a;for in ------ 相当于JAVA的工具类&#xff0c;直…

docker学习入门篇

1、docker简介 docker官网&#xff1a; www.docker.com dockerhub官网&#xff1a; hub.docker.com docker文档官网&#xff1a;docs.docker.com Docker是基于Go语言实现的云开源项目。 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere(构建&…

每日一题——LeetCode2129.将标题首字母大写

方法一 个人方法 将字符串转为数组&#xff0c;遍历数组&#xff0c;对数组的每一个元素&#xff0c;先全部转为小写&#xff0c;如果当前元素长度大于2&#xff0c;将第一个字符转为大写形式 var capitalizeTitle function(title) {titletitle.split( )for(let i0;i<tit…

概要了解postman、jmeter 、loadRunner

postman还蛮好理解的&#xff0c;后续复习的话着重学习关联接口测试即可&#xff0c;感觉只要用几次就会记住&#xff1a; 1 从接口的响应结果当中提取需要的数据 2 设置成环境变量/全局变量&#xff08;json value check 、set environment para 3写入到下一个接口的请求数据中…

工具-百度云盘服务-身份认证

目标 通过百度网盘API的方式去获取网盘中的文件&#xff0c;要实现这的第一步就是需要获取网盘的权限。资料(参考) 如果期望应用访问用户的网盘文件&#xff0c;则需要经过用户同意&#xff0c;这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是…

1688 API商品详情接口与ERP系统的集成

API接口与ERP系统集成的应用主要包括数据同步、业务流程自动化和信息共享三个方面。 数据同步&#xff1a;通过API接口&#xff0c;ERP系统可以与其他系统之间进行数据的交换和同步。比如&#xff0c;将销售订单从电商平台自动导入到ERP系统中&#xff0c;然后将发货信息同步回…

Kettle安装使用手册

Kettle安装使用手册 目录 1 KETTLE 介绍 5 1.1. 核心组件 5 1.2. 组成部分 5 1.3. 概念模型 6 1.3.1. Transformation(转换) 6 1.3.2. Steps(步骤) 7 1.3.3. Hops(节点连接) 7 1.3.4. Jobs(工作) 7 1.3.5. Variable(变量) 8 1.4. 查看版本 9 1.5. 选项设置 10 2 安装…

OEKO-TEX®2024新规定于4月1日正式生效

OEKO-TEX协会参照最新的科学发现和法律法规&#xff0c;就测试标准、限量值和指南发布了年度更新。新规定将在常规过渡期结束后&#xff0c;于2024年4月1日正式生效&#xff08;PFAS限量值例外&#xff09;。新的总氟(TF)限量值取代了之前的可萃取有机氟(EOF)&#xff0c;该更新…