Django 第十三课 -- Form 组件

Django Form 组件用于对页面进行初始化,生成 HTML 标签,此外还可以对用户提交的数据进行校验(显示错误信息)。

报错信息显示顺序:

  • 先显示字段属性中的错误信息,然后再显示局部钩子的错误信息。
  • 若显示了字段属性的错误信息,就不会显示局部钩子的错误信息。
  • 若有全局钩子,则全局钩子是等所有的数据都校验完,才开始进行校验,并且全局钩子的错误信息一定会显示。

使用 Form 组件,需要先导入 forms:

from django import forms

接下来我们在 app01 目录下创建一个 My_forms.py:

from django import forms
from django.core.exceptions import ValidationError
from app01 import modelsclass EmpForm(forms.Form):name = forms.CharField(min_length=4, label="姓名", error_messages={"min_length": "你太短了", "required": "该字段不能为空!"})age = forms.IntegerField(label="年龄")salary = forms.DecimalField(label="工资")

字段属性:

  • label:输入框前面的文本信息。
  • error_message:自定义显示的错误信息,属性值是字典, 其中 required 为设置不能为空时显示的错误信息的 key。
from django.shortcuts import render, HttpResponse
from app01.My_Forms import EmpForm
from app01 import models
from django.core.exceptions import ValidationError
# Create your views here.def add_emp(request):if request.method == "GET":form = EmpForm()return render(request, "add_emp.html", {"form": form})else:form = EmpForm(request.POST)if form.is_valid():  # 进行数据校验# 校验成功data = form.cleaned_data  # 校验成功的值,会放在cleaned_data里。data.pop('r_salary')print(data)models.Emp.objects.create(**data)return HttpResponse('ok')# return render(request, "add_emp.html", {"form": form})else:print(form.errors)    # 打印错误信息clean_errors = form.errors.get("__all__")print(222, clean_errors)return render(request, "add_emp.html", {"form": form, "clean_errors": clean_errors})

app01/urls.py 文件添加以下规则:

path('add_emp/', views.add_emp)

HTML 模版:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title></title>
</head>
<body><h3>添加员工</h3>{#1、自己手动写HTML页面#}
<form action="" method="post"><p>姓名:<input type="text" name="name"></p><p>年龄:<input type="text" name="age"></p><p>工资:<input type="text" name="salary"></p><input type="submit">
</form>{#2、通过form对象的as_p方法实现#}
{#<form action="" method="post" novalidate>#}
{#    {% csrf_token %}#}
{#    {{ form.as_p }}#}
{#    <input type="submit">#}
{#</form>#}{#3、手动获取form对象的字段#}
{#<form action="" method="post" novalidate>#}
{#    {% csrf_token %}#}
{#    <div>#}
{#        <label for="id_{{ form.name.name }}">姓名</label>#}
{#        {{ form.name }} <span>{{ form.name.errors.0 }}</span>#}
{#    </div>#}
{#    <div>#}
{#        <label for="id_{{ form.age.name }}">年龄</label>#}
{#        {{ form.age }} <span>{{ form.age.errors.0 }}</span>#}
{#    </div>#}
{#    <div>#}
{#        <label for="id_salary">工资</label>#}
{#        {{ form.salary }} <span>{{ form.salary.errors.0 }}</span>#}
{#    </div>#}
{#    <input type="submit">#}
{#</form>#}{#4、用for循环展示所有字段#}
{#<form action="" method="post" novalidate>#}
{#    {% csrf_token %}#}
{#    {% for field in form %}#}
{#        <div>#}
{#            <label for="id_{{ field.name }}">{{ field.label }}</label>#}
{#            {{ field }} <span>{{ field.errors.0 }}</span>#}
{#        </div>#}
{#    {% endfor %}#}
{#    <input type="submit">#}
{#</form>#}</body>
</html>

运行结果如下图所示:

局部钩子和全局钩子

定义 Form 类:

from django import forms
from django.core.exceptions import ValidationError
from app01 import models
class EmpForm(forms.Form):name = forms.CharField(min_length=5, label="姓名", error_messages={"required": "该字段不能为空!","min_length": "用户名太短。"})age = forms.IntegerField(label="年龄")salary = forms.DecimalField(max_digits=5, decimal_places=2, label="工资")r_salary = forms.DecimalField(max_digits=5, decimal_places=2, label="请再输入工资")def clean_name(self):  # 局部钩子val = self.cleaned_data.get("name")if val.isdigit():raise ValidationError("用户名不能是纯数字")elif models.Emp.objects.filter(name=val):raise ValidationError("用户名已存在!")else:return valdef clean(self):  # 全局钩子 确认两次输入的工资是否一致。val = self.cleaned_data.get("salary")r_val = self.cleaned_data.get("r_salary")if val == r_val:return self.cleaned_dataelse:raise ValidationError("请确认工资是否一致。")

views.py 文件代码:

def add_emp(request):if request.method == "GET":form = EmpForm()  # 初始化form对象return render(request, "add_emp.html", {"form":form})else:form = EmpForm(request.POST)  # 将数据传给form对象if form.is_valid():  # 进行校验data = form.cleaned_datadata.pop("r_salary")models.Emp.objects.create(**data)return redirect("/index/")else:  # 校验失败clear_errors = form.errors.get("__all__")  # 获取全局钩子错误信息return render(request, "add_emp.html", {"form": form, "clear_errors": clear_errors})

模板文件代码如下:

<form action="" method="post" novalidate>{% csrf_token %}<div><label for="id_{{ form.name.name }}">姓名</label>{{ form.name }} <span>{{ form.name.errors.0 }}</span></div><div><label for="id_{{ form.age.name }}">年龄</label>{{ form.age }} <span>{{ form.age.errors.0 }}</span></div><div><label for="id_salary">工资</label>{{ form.salary }} <span>{{ form.salary.errors.0 }}{{ clear_errors.0 }}</span></div><div><label for="id_r_salary">请再输入工资</label>{{ form.r_salary }} <span>{{ form.r_salary.errors.0 }}{{ clear_errors.0 }}</span></div><input type="submit">
</form>

运行结果如下图所示:

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

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

相关文章

如何打造高校实验室预约系统?Java SpringBoot助力高效管理,MySQL存储数据,Vue前端展现,四步实现学生轻松预约!

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案

出现cannot find a valid baseurl for repo:base/7/x86_64错误通常是由于YUM仓库源无法找到或无法访问&#xff0c;导致YUM无法正常工作。这种情况常见于CentOS 7系统。解决这个问题需要检查几个方面&#xff0c;如网络连接、DNS设置和YUM仓库源配置。 &#x1f9d1; 博主简介&…

思科交换机端口安全配置1

#网络安全技术实现# #任务一交换机端口安全配置1# #1配置计算机的IP 地址、子网掩码和网关 #2配置交换机B的主机名称&#xff0c;创建vlan 10和vlan 20&#xff0c;将f0/1、2划入vlan 10&#xff0c;f0/3、4划入vlan 20&#xff0c;将f0/24配置为Trunk Switch(config)#hostna…

修改服务器DNS解析及修改自动对时时区

修改服务器DNS解析&#xff1a; 1、搜索一下当地的DNS服务器的地址 2、登录服务器&#xff0c;执行 vim /etc/resolv.conf文件&#xff0c;在nameserver字段后填写DNS服务的地址 3、chattr i /etc/resolv.conf 加上不可修改权限&#xff0c;防止重启DNS被修改 修改自动对时…

解读GaussianTalker:利用音频驱动的基于3D高斯点染技术的实时高保真讲话头像合成

单位&#xff1a;首尔大学 项目地址&#xff1a;https://ku-cvlab.github.io/GaussianTalker/ github&#xff1a;https://github.com/KU-CVLAB/gaussiantalker 本文是对GaussianTalker的解读&#xff0c;欢迎大家阅读指正&#xff01; 目录 前言摘要一、背景介绍二 相关工作三…

centos 7部署nacos 2.4.1版本单点方式

文章目录 Nacos&#xff1a;微服务架构中的服务发现与配置管理利器官方网址引言Nacos简介Nacos的核心功能1. 服务发现和服务健康监测2. 动态配置服务3. 服务及其元数据管理 Nacos的工作原理Nacos的集群部署与高可用性Nacos的使用场景如何使用Nacos1. 安装Nacos2. 服务注册与发现…

设计模式 -- 访问者模式(Visitor Pattern)

1 问题引出 1.1 测评系统的需求 将观众分为男人和女人&#xff0c;对歌手进行测评&#xff0c;当看完某个歌手表演后&#xff0c;得到他们对该歌手不同的评价(评价 有不同的种类&#xff0c;比如 成功、失败 等) 1.2 传统方式解决 如果系统比较小&#xff0c;还是 ok 的&#…

安装 rocky9.4

涉及软件&#xff1a;virtualbox、rocky linux 9.4、mobaxterm virtualbox新建虚拟机&#xff0c;设置虚拟机配置 启动虚拟机&#xff0c;第一次会提示挂载虚拟光盘&#xff0c;选择下载的rocky linux 9.4。 选择第一项&#xff0c;安装rocky linux 9.4 进入安装设置&#…

VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累

今天遇到一个问题&#xff0c;是关于el-input-number组件的&#xff0c;发现数据明明已经更改了&#xff0c;但是页面上组件输入框中还是之前的值。 比如上方输入框中&#xff0c;我输入120.5&#xff0c;就会出现下面的诡异现象 回显此值是120.779&#xff0c;但是页面上输入…

GNU的编译工具链

文章目录 GNU的编译工具链 GNU的编译工具链 预编译器cpp 编译器 cc1 汇编器 as 链接器 ld 其中cpp和cc1属于gcc的一部分&#xff0c;as和ld属于binutils的一部分。

STM32嵌入式面试知识点总结

一、STM32F1和F4的区别&#xff1f; 解答&#xff1a; 参看&#xff1a;STM32开发 – STM32初识内核不同&#xff1a;F1是Cortex-M3内核&#xff0c;F4是Cortex-M4内核&#xff1b;主频不同&#xff1a;F1主频72MHz&#xff0c;F4主频168MHz&#xff1b;浮点运算&#xff1a;…

【补-网络安全】日常运维(二)终端端口占用排查

文章目录 一、利用ipconfig、netstat 命令行统计二 、策略封禁IP 引言:检查频繁,第一步我们梳理完资产,第二步应该对资产终端进行一个排查,诊断把脉,了解清楚系统的端口占用及开放情况 一、利用ipconfig、netstat 命令行统计 1.先用ipconfig定位该终端的IP地址 2.明确IP地址后…

轴承知识大全,详细介绍(附3D图纸免费下载)

轴承一般由内圈、外圈、滚动体和保持架组成。对于密封轴承&#xff0c;再加上润滑剂和密封圈&#xff08;或防尘盖&#xff09;。这就是轴承的全部组成。 根据轴承使用的工作状况来选用不同类型的轴承&#xff0c;才能更好的发挥轴承的功能&#xff0c;并延长轴承的使用寿命。我…

逻辑学(Logic)

GPT-4o (OpenAI) 逻辑学是研究论证的原则和标准的学科&#xff0c;主要关注如何正确地推理和论证。从抓取股票日线数据到形成有效的分析&#xff0c;我们可以应用逻辑推理。 逻辑推理步骤&#xff1a; 1. 明确目标&#xff1a;我们要抓取股票的日线数据。 2. 分析需求&#x…

网络原理 - 初识

文章目录 局域网(LAN)广域网(WAN)网络设备IP地址格式 端口号格式 认识网络协议协议分层 OSI七层模型(只是理论,没有实际运用)TCP/IP五层&#xff08;或四层&#xff09;模型网络设备所在分层 封装和分用 计算机之间通过网络来传输数据&#xff0c;也称为网络通信。 根据网络互连…

18、Gemini-Pentest-v2

难度 中 目标 root权限 一个flag 靶机启动环境为VMware kali 192.168.152.56 靶机 192.168.152.63 信息收集 web测试 访问80端口 上面介绍了一下这个系统是一个内部系统&#xff0c;让员工查看他们的个人资料还可以导出为PDF 页面还有一个链接是UserList可以访问但是页面什…

前端【CSDN创作优化3】CSDN自定义模块:解决保存CSDN自定义模块时显示fail

【CSDN创作优化3】CSDN自定义模块&#xff1a;解决保存CSDN自定义模块时显示fail 写在最前面遇到的问题&#xff1a;保存CSDN自定义模块时显示fail1.符号问题&#xff1a;删除所有符号2.超出字符长度限制&#xff1a;压缩保存3.li模块不见了&#xff1a;小窗口正常显示元素 &am…

补题篇--codeforces

传送门&#xff1a;Problem - G - Codeforces 题意&#xff1a; 思路&#xff1a; 注意&#xff1a; n 的范围很小&#xff0c;大概率考察状态压缩 因此这个题可以考虑用 状压dp f[i][j] 表示状态为 i 的选法&#xff0c;以第 j 首歌为结尾的播放列表中的歌曲总数 f[ i | …

codeforces Round 970 (Div. 3)(A-F)

文章目录 [Codeforces Round 970 (Div. 3)](https://codeforces.com/contest/2008)A-[Sakurakos Exam](https://codeforces.com/contest/2008/problem/A)B-[Square or Not](https://codeforces.com/contest/2008/problem/B)C-[Longest Good Array](https://codeforces.com/cont…

Linux_kernel汇编04

一、温故知新 1、Uboot的操作 1&#xff09;Uboot的简介 需要确定一点&#xff0c;系统上电后&#xff0c;Uboot是第一个执行的系统软件。 类似PC机上的BIOS&#xff08;Basic Input Output System&#xff09; Uboot的核心功能&#xff1a; 【1】负责初始化硬件 【2】负责加载…