Django——forms组件

Django——forms组件

forms组件:通过后端在Django中定义forms类,可以在 html 中动态的生成一个表单;检验用户提交的数据。

在应用中创建一个名为 :forms 的py文件

# 导入 forms 组件
from  django import forms# 自定义 forms 表单类 , 表单类必须继承 forms.Form
# 在 Django 的 forms 组件中没有提供按钮标签
class MyForm(forms.Form):# 定义表单标签属性# 在定义之后 , 渲染到 html 中是一个 label 和 input 标签username = forms.CharField(label='用户名')password = forms.CharField(label='密码')
def showforms(request):# 渲染表单:生成一个表单类对象 , 提交到 html 中if request.method == 'GET':# 生成一个空白的表单类对象forms = MyForm()else:# 但请求为 post 请求的时候 , 说明用户提交数据# 将数据传递该 form 组件(表单类接收的数据要是字典类型的数据)forms = MyForm(request.POST)res = '数据已提交'return render(request , 'index.html' , locals())
<body>
<form method="post">{% csrf_token %}{{ forms }}<input type="submit" value="注册">
</form>
<span>{{ res }}</span>
</body>

在模板中渲染自定义表单类

<form method="post">{% csrf_token %}<p>使用表格的样式渲染</p>{{ forms.as_table }}<p>使用段落的样式渲染</p>{{ forms.as_p }}<p>使用列表的样式渲染</p>{{ forms.as_ul }}<input type="submit" value="注册">
</form>

forms 组件提供的组件设置

# 自定义 forms 表单类 , 表单类必须继承 forms.Form
# 在 Django 的 forms 组件中没有提供按钮标签
class MyForm(forms.Form):# 定义表单标签属性# 在定义之后 , 渲染到 html 中是一个 label 和 input 标签username = forms.CharField(label='用户名')password = forms.CharField(label='密码',# 设置 password 文本框widget = forms.PasswordInput(),)# 邮箱email = forms.EmailField(label='邮箱')# 日期day = forms.DateField(label='日期',# 设置日历选项widget=forms.TextInput(attrs={'type':'date'}))# 选项框# choices 设置选项内容 , 内容要以元组类型设置gender = forms.ChoiceField(choices=((1,'女'),(2,'男'),(3,'未知')) , label='性别',# 设置选项框类型: 单选 RadioSelectwidget=forms.RadioSelect(),# 设置默认选项initial = 3)work = forms.ChoiceField(choices=((1,'学生'),(2,'搬砖'),(3,'退休')) , label='职业',# 设置选项框类型: 单选 Selectwidget=forms.Select(),# 设置默认选项initial = 3)hobby = forms.ChoiceField(choices=((1,'爬山'),(2,'唱歌'),(3,'跳舞'),(4,'rap'),(5,'跆拳道'),(6,'篮球')) , label='爱好',# 设置选项框类型: 多选 CheckboxSelectMultiplewidget=forms.CheckboxSelectMultiple(),# 设置默认选项initial = [2,6])subject = forms.MultipleChoiceField(choices=((1,'物理'),(2,'化学'),(3,'生物'),(4,'地理'),(5,'历史'),(6,'政治')) , label='科目',# 设置选项框类型: 多选 CheckboxSelectMultiplewidget=forms.CheckboxSelectMultiple(),# 设置默认选项initial = [1])xy = forms.CharField(label='阿宸要你写代码的协议',widget=forms.CheckboxInput())

forms 组件验证数据

class RegisterView(View):def get(self , request):return render(request , 'register.html')def post(self , request):# 数据给 forms 组件进行数据校验register_form = RegisterForm(request.POST)# 判断数据是否合法# is_valid 判断表单类中获取的数据校验是否合法,合法返回 True# register_form.errors 存放的就是数据的错误信息if register_form.is_valid():return HttpResponse('注册成功')else:return render(request , 'register.html' , locals())
# 数据验证
class RegisterForm(forms.Form):username = forms.CharField(max_length=10 , min_length=3,# 设置错误信息字典error_messages={'max_length' : '用户名长度超出','min_length' : '用户名长度不足','required' : '不允许为空'})password = forms.CharField(max_length=15 , min_length=6,error_messages={'max_length': '密码长度超出','min_length': '密码长度不足','required': '不允许为空'})password2 = forms.CharField(max_length=15 , min_length=6,error_messages={'max_length': '密码长度超出','min_length': '密码长度不足','required': '不允许为空'})# 验证数据使用钩子函数 , 钩子:自定义的校验规则# 局部钩子:给一个字段数据校验# 定义局部钩子的函数名称:clean_属性名def clean_username(self):# 勾取数据:获取到对应的属性数据data = self.cleaned_data.get('username')# 进行数据检验if not re.match(r'^[a-zA-Z0-9]{3,10}$' , data):# 添加异常信息# self.add_error(属性 , 错误信息)self.add_error('username' , '用户名不合法')# 把勾取到的数据返回回去return data# 全局钩子:过多个字段校验def clean(self):pwd1 = self.cleaned_data.get('password')pwd2 = self.cleaned_data.get('password2')if pwd1 != pwd2:self.add_error('password2', '两次密码不一致')return self.cleaned_data
<body>
{#  novalidate 关闭浏览器自动渲染 form 组件的错误信息 #}
<form method="post" novalidate>{% csrf_token %}<p>用户名:<input type="text" name="username"></p><span style="color:red;">{{ register_form.username.errors.0 }}</span><p>密码:<input type="password" name="password"></p><span style="color:red;">{{ register_form.password.errors.0 }}</span><p>确认密码:<input type="password" name="password2"></p><span style="color:red;">{{ register_form.password2.errors.0 }}</span><input type="submit" value="注册">
</form>
</body>

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

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

相关文章

【python】(09)理解Python中的zip()和zip(*iterable)

系列文章回顾 【python】(01)初识装饰器Decorator 【python】(02)初识迭代器Iterator 【python】(03)初识生成器Generator 【python】(04)python中实现多任务并发和并行的区别 【python】(05)如何使用python中的logging模块记录日志信息 【python】(06)理解Python中的 lambda 、…

借记、贷记、来账、往账、挂账

应用场景&#xff1a;支付系统_跨行支付 一、借、贷、借记、贷记 借、贷&#xff1a;复式记账的一种记账符号&#xff0c;和科目结合起来&#xff0c;可以清晰的表示业务级别的资金流动。 贷记业务&#xff1a;指付款方向收款方发起的付款业务&#xff0c;指负债的增加或资产方…

PWM实现电机的正反转和调速以及TIM定时器

pwm.c #include "pwm.h"/* PWM --- PA2 --TIM2_CH3 //将电机信号控制一根接GND,一根接在PA2(TIM2_CH3)&#xff0c; 输出PWM控制电机快慢 TIM2挂在APB1 定时器频率&#xff1a;84MHZ*/ void Pwm_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;TIM_TimeBaseInitT…

Django下载使用、文件介绍

【一】下载并使用 【1】下载框架 &#xff08;1&#xff09;注意事项 计算机名称不要出现中文python解释器版本不同可能会出现启动报错项目中所有的文件名称不要出现中文多个项目文件尽量不要嵌套,做到一项一夹 &#xff08;2&#xff09;下载 Django属于第三方模块&#…

张宇高数一学习笔记-1-第一讲-函数极限与连续(1)

1、函数的概念与特性 1.1、函数 1、y才是x的函数&#xff0c;而f()是加工法则。 2、定义域是基于加工法则f()存在的&#xff0c;也就是说加工法则f()对()内数据的限制范围就是定义域。而 3、自变量x的取值范围来源于&#xff1a;定义域对()内的含x表达式的限制下得出的x的取值…

【C2架构】

C2架构 C2 架构也就可以理解为&#xff0c;恶意软件通过什么样的方式获取资源和命令&#xff0c;以及通过什么样的方式将数据回传给攻击者 使用的通信方式&#xff1a; 传输协议层 TCP、UDP 网络协议层 icmp&#xff08;ping&#xff09; 应用协议层 HTTP/HTTPS、FTP、DNS、S…

[深度学习] 常见名称概念

SOTA SOTA是指"State-of-the-art"的缩写&#xff0c;意为"最先进的技术"。SOTA是指在某个领域或任务中&#xff0c;当前被认为是最好的技术或模型。随着技术的不断发展和进步&#xff0c;SOTA会随之变化。对于机器学习和人工智能领域而言&#xff0c;SOTA…

20.Ubuntu下安装GCC

文章目录 Ubuntu下安装GCC查看官方安装指导错误缺少gmp库缺少32位开发库libcg: error: gengtype-lex.c: No such file or directoryreference 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Ubuntu下安装GCC 为了支持新的c标准&#xff…

深入了解 Vue 组件

在 Vue.js 中&#xff0c;组件是构建用户界面的核心概念之一。通过组件&#xff0c;我们可以将界面分割成独立、可复用的模块&#xff0c;使得代码更加清晰、灵活&#xff0c;并且更易于维护。在本文中&#xff0c;我们将深入探讨 Vue 组件的基本概念、创建方法以及常见用法。 …

STM32微控制器中,如何处理多个同时触发的中断请求?

在STM32微控制器中&#xff0c;处理多个同时触发的中断请求需要一个明确的中断优先级策略&#xff0c;以确保关键任务能够及时得到响应。STM32的中断控制器&#xff08;NVIC&#xff09;支持优先级分组&#xff0c;允许开发者为不同的中断设置抢占优先级和子优先级。本文将详细…

uniapp 打包后缺少maps模块和share模块的解决方案

缺失maps模块 我的应用 | 高德控制台 缺失share模块 QQ互联管理中心 微信开放平台

星云小窝项目1.0——项目介绍(一)

星云小窝项目1.0——项目介绍&#xff08;一&#xff09; 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …

Linux cp、mv命令显示进度条

1.advcpmv 平常使用cp 拷贝大文件时&#xff0c;看不到多久可以完成&#xff0c;虽然加上-v参数也只能看到正在拷贝文件&#xff0c;那就使用以下方法实现 git clone https://github.com/jarun/advcpmv.git cd advcpmv/ bash install.shmv ./advcp /usr/local/bin/ mv ./advmv …

SpringBoot3+Vue3项目的阿里云部署--将后端以及前端项目打包

一、后端&#xff1a;在服务器上制作成镜像 1.准备Dockerfile文件 # 基础镜像 FROM openjdk:17-jdk-alpine # 作者 MAINTAINER lixuan # 工作目录 WORKDIR /usr/local/lixuan # 同步docker内部的时间 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ…

HCIP【PPP协议CHAP验证】

目录 实验目的&#xff1a; 实验拓扑图: 实验过程&#xff1a; 一&#xff1a;按照图示配置所有设备的IP地址 (1)R1和R2使用PPP链路直连 (2)R2和R3把2条PPP链路捆绑为PPP MP直连 二&#xff1a;PPP协议的CHAP验证 &#xff08;3&#xff09;R2 对 R1 的 PPP 进行单向 c…

代码随想录Day57:回文子串、最长回文子序列

回文子串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int res 0;for(int i s.size() - 1; i > 0; i--){for(int j i; j < s.size(); j){if(i j || (s[i] s[j] …

LeetCode——贪心算法

贪心思想 保证每次操作都是局部最优的&#xff0c;并且最后得到的结果是全局最优的——减少遍历的次数 1.买卖股票的最佳时机 121简单 这里的贪心思想是更新股票的最低价和最大利润&#xff0c;规则是先买后卖 class Solution {public int maxProfit(int[] prices) {// 记录…

C#执行命令行

效果图 主要代码方法 private Process p;public List<string> ExecuteCmd(string args){System.Diagnostics.Process p new System.Diagnostics.Process();p.StartInfo.FileName "cmd.exe";p.StartInfo.RedirectStandardInput true;p.StartInfo.RedirectSta…

权限提升-Windows权限提升篇数据库篇MYSQLMSSQLORACLE自动化项目

知识点 1、Web到Win-数据库提权-MSSQL 2、Web到Win-数据库提权-MYSQL 3、Web到Win-数据库提权-Oracle 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学习权限提升转移技术&#xff1…

108、3D Gaussian Splatting for Real-Time Radiance Field Rendering

简介 官网 更少训练时间的同时实现最先进的视觉质量&#xff0c;能在1080p分辨率下实现高质量的实时(≥30 fps)新视图合成 NeRF使用隐式场景表示&#xff0c;体素&#xff0c;点云等属于显示建模方法&#xff0c;3DGS就是显示辐射场。它用3D高斯作为灵活高效的表示方法&…