Django ModelForm使用(初学)

1.目的是根据员工表字段,实现一个新增员工的数据填写页面

2.在views.py文件中按下面的格式写

定义 ModelForm 类:UserModelForm (自己命名的类名)使用时需要导入包

定义视图函数:user_model_form_add(在函数中使用form = UserModelForm())

定义了一个 Django ModelFormUserModelForm,用于创建或编辑 UserInfo 模型的实例,表单包含 name、password、age、account、create_time、gender depart 字段。在 __init__ 方法中,为每个字段的 HTML 输入元素动态添加了 class="form-control" placeholder 属性,以便使用 Bootstrap 样式并显示字段标签作为占位符。user_model_form_add 视图函数处理 GET 和 POST 请求:当用户访问页面时(GET 请求),渲染一个空表单;当用户提交表单时(POST 请求),验证表单数据,如果数据有效则保存到数据库并重定向到 /user/list 页面,如果数据无效则打印错误信息(用于调试)。

  • 表单定义:通过 ModelForm 快速生成与模型关联的表单,并自定义字段的 HTML 属性。

  • 视图处理:处理用户请求,显示空表单或验证并保存提交的数据,最后重定向或返回错误信息。

注意:form.save() 会将数据保存到数据库中,这个数据库就是我们在UserModelForm中定义的model = models.UserInfo,即UserInfo表

from django.shortcuts import render,redirect
from employees import models
from django import formsclass UserModelForm(forms.ModelForm):class Meta:model = models.UserInfofields = ["name","password","age", "account", "create_time", "gender", "depart"]def __init__(self, *args, **kwargs):# 调用父类的初始化方法super().__init__(*args, **kwargs)# 遍历表单中的所有字段for name, field in self.fields.items():# 为每个字段的 widget 添加 HTML 属性field.widget.attrs = {"class": "form-control",  # 添加 Bootstrap 样式"placeholder": field.label  # 设置占位符为字段的标签}def user_model_form_add(request):# 处理 GET 请求:显示空表单if request.method == 'GET':form = UserModelForm()  # 创建一个空的 UserModelForm 实例# 渲染模板,并将表单对象传递给模板return render(request, 'user_model_form_add.html', {"form": form})# 处理 POST 请求:提交表单数据form = UserModelForm(data=request.POST)# 验证表单数据是否有效if form.is_valid():# 如果数据有效,保存表单数据到数据库form.save()return redirect("/user/list")  # 重定向到用户列表页面else:# 如果数据无效,打印错误信息(用于调试)print(form.errors)

user_model_form_add.html 使用传递过来的数据 

完整代码

{% extends 'layout.html' %}{% block content %}
<div class="container"><div class="c1"><a class="btn btn-success" href="/user/add">新建用户</a></div><div class="c1"><a class="btn btn-success" href="/user/model/form/add">新建用户ModelForm</a></div><div class="card c1"><div class="card-header">新建用户</div><div class="card-body"><form method="post">{% csrf_token %}{% for field in form%}<div class="form-label"><label>{{ field.label }}</label>{{ field }}</div>{% endfor %}<button type="submit" class="btn btn-primary">提交</button></form></div></div></div>
{% endblock %}

实现效果

 输入数据,提交

 添加成功

3.校验错误信息提示 

上面编写的错误输出只是测试,我想直接在网页上显示错误提示,这样更直观,代码修改如下

def user_model_form_add(request):# 处理 GET 请求:显示空表单if request.method == 'GET':form = UserModelForm()  # 创建一个空的 UserModelForm 实例# 渲染模板,并将表单对象传递给模板return render(request, 'user_model_form_add.html', {"form": form})# 处理 POST 请求:提交表单数据form = UserModelForm(data=request.POST)# 验证表单数据是否有效if form.is_valid():# 如果数据有效,保存表单数据到数据库form.save()return redirect("/user/list")  # 重定向到用户列表页面else:# 校验失败,在页面上显示错误信息return render(request, 'user_model_form_add.html', {"form": form})

user_model_form_add.html增加这一行

<span style="color: red;">{{ field.errors.0 }}</span>

效果如下,出现提示

上面的是浏览器做的校验,我们想自己校验提示,增加一个:novalidate

效果如下

我想对都写字段增加限制,Django会自动检查,例如

重写name和password字段,设置最小长度和标签,如果用户输入的长度不足,Django 会自动显示错误提示。

效果

更复杂的写法

注意导入对应的库 

from django.shortcuts import render,redirect
from employees import models
from django import forms
from django.core.validators import MinLengthValidator, RegexValidatorclass UserModelForm(forms.ModelForm):name = forms.CharField(min_length=3,label="用户名")password = forms.CharField(label="密码",widget=forms.PasswordInput(),validators=[MinLengthValidator(6, message="密码长度不能少于 6 个字符。"),RegexValidator(regex=r'^(?=.*\d)(?=.*[a-zA-Z]).{6,20}$',message="密码必须包含字母和数字,且长度为 6-20 个字符。")])class Meta:model = models.UserInfofields = ["name","password","age", "account", "create_time", "gender", "depart"]def __init__(self, *args, **kwargs):# 调用父类的初始化方法super().__init__(*args, **kwargs)# 遍历表单中的所有字段for name, field in self.fields.items():# 为每个字段的 widget 添加 HTML 属性field.widget.attrs = {"class": "form-control",  # 添加 Bootstrap 样式"placeholder": field.label  # 设置占位符为字段的标签}

效果

 

如果想修改提示变成中文,例如

修改如下

效果

学习:【最新Python的web开发全家桶(django+前端+数据库)-哔哩哔哩】 https://b23.tv/hSTu5xi 

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

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

相关文章

华为固态电池引发的思索

华为固态电池真牛&#xff01; 超长续航&#xff1a;单次充电即可行驶3000公里 极速充电&#xff1a;五分钟内充满80% 极致安全&#xff1a;不可燃、不漏液 长寿命设计&#xff1a;循环寿命达10000次以上 如上是华为电池展示的优势项&#xff0c;每一条都让我们心动不已。…

美信监控易:运维新时代,守护数据安全

在 2025 年这个科技飞速发展的时代&#xff0c;数据安全已成为各行业关注的焦点。随着云计算、大数据、物联网等技术的不断推进&#xff0c;运维数据的保护面临着新的挑战与要求。美信时代公司的美信监控易运维管理软件&#xff0c;以其卓越的功能、特性和竞争力&#xff0c;为…

个人博客5年回顾

https://huangtao01.github.io/ 五年前&#xff0c;看程序羊的b站视频做的blog&#xff0c;受限于网络&#xff0c;只能单向学习&#xff0c;没有人指导与监督&#xff0c;从来没有想过&#xff0c;有没有什么问题&#xff1f; 一、为什么要做个人博客&#xff1f; 二、我是怎么…

Unity合批处理优化内存序列帧播放动画

Unity合批处理序列帧优化内存 介绍图片导入到Unity中的处理Unity中图片设置处理Unity中图片裁剪 创建序列帧动画总结 介绍 这里是针对Unity序列帧动画的优化内容&#xff0c;将多个图片合批处理然后为了降低Unity的内存占用&#xff0c;但是相对的质量也会稍微降低。可自行进行…

【Docker】容器被停止/删除的方式及命令:全面解析与实践指南

文章目录 引言一、容器的生命周期二、停止容器的命令及方式1. docker stop 命令2. docker kill 命令3. docker pause 和 docker unpause 命令4. docker restart 命令 三、删除容器的命令及方式1. docker rm 命令2. docker container prune 命令3. docker rm 与 docker rmi 的区…

大数据SQL调优专题——Flink执行原理

引入 上一篇我们了解了Spark&#xff0c;相比起MapReduce来说&#xff0c;它确实已经快了超级多了&#xff0c;但是人类的欲望是没有止境的&#xff0c;这也是推动人类进步的动力。 Flink就是为了满足实时响应的场景需求诞生的。 其实在Flink之前&#xff0c;实时处理其实已…

【Cocos TypeScript 零基础 16.1】

目录 FlappyBird背景其他心得_刚体audio部分 FlappyBird 本人没有按照老师的做法去做,大体差不多, 当然老师做的更精细,有些不会的还是参考老师的方法 参考部分 小鸟如何像真实物体一样的重力效果点击如何使小鸟飞翔 省略部分 3. 小鸟多动画(飞机大战其实有做,单纯偷懒) 4. …

CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台

❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker&#xff0c;这是一个基于网络的计算平台&#xff0c;旨在简化和加速 EnzyDock 对接模拟的设置过程&…

腿足机器人之六- 前向运动学

腿足机器人之六- 前向运动学 刚体运动学基础坐标系定义旋转矩阵与欧拉角齐次变换矩阵&#xff08;平移旋转的统一表示&#xff09; 运动链建模串联运动链结构&#xff08;从基座到末端的关节连接&#xff09;标准Denavit-Hartenberg&#xff08;D-H&#xff09;参数法改进D-H参…

uni-app发起网络请求的三种方式

uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header&#xff1a;设置请求的 header&#xff0c;header 中不能设置 Referer&#xff1b; method&#xff1a;请求方法&#xff1b; timeout&#xff1a;超时时间&#xff0c;单位 ms&a…

【linux】更换ollama的deepseek模型默认安装路径

【linux】更换ollama的deepseek模型默认安装路径 文章目录 【linux】更换ollama的deepseek模型默认安装路径Ollama 默认安装路径及模型存储路径迁移ollama模型到新的路径1.创建新的模型存储目录2.停止ollama3.迁移现有模型4.修改 Ollama 服务配置5.重启ollama6.验证迁移是否成功…

「软件设计模式」装饰者模式(Decorator)

深入解析装饰者模式&#xff1a;动态扩展功能的艺术&#xff08;C实现&#xff09; 一、模式思想与应用场景 1.1 模式定义 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将对象放入包含行为的特殊封装对象中&#xff0c;动态地…

java项目打包成docker镜像步骤

java项目打包成docker镜像步骤 1.使用maven把java文件打包成可执行的jar包2. 打包成Dockerfile3. 把jar包和DockerFile两个文件上传到服务器上。4. 制作镜像5.启动容器 1.使用maven把java文件打包成可执行的jar包 2. 打包成Dockerfile # 先从dockerhub找到对应版本的openjdk的…

后台管理系统-项目初始化

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发:基于已有的代码(项目工程,脚手架)开进行新功能的开发 所以看懂已有的框架中的既有代码,变得很重要了 1. 背景知识 后台管理系统是一种最常见的应用模式,不同的管理系统之间有很多相似的地方…

【Scrapy】Scrapy教程6——提取数据

前一小节我们拿到了页面的数据,那页面中那么多内容,我们想要其中的部分内容,该如何获取呢?这就需要对我们下载到的数据进行解析,提取出来想要的数据,这节就讲讲如何提取数据。 引入 我们编辑保存下来的shouye.html文件看下,发现这是什么鬼,全是如下图的代码。 没错…

RabbitMQ 的工作模式

目录 工作模式 Simple&#xff08;简单模式&#xff09; Work Queue&#xff08;工作队列&#xff09; Publish/Subscribe&#xff08;发布/订阅&#xff09; Exchange&#xff08;交换机&#xff09;? Routing&#xff08;路由模式&#xff09; Topics&#xff08;通配…

Copilot Next Edit Suggestions(预览版)

作者&#xff1a;Brigit Murtaugh&#xff0c;Burke Holland 排版&#xff1a;Alan Wang 我们很高兴向你介绍在本次 Visual Studio Code 发布中&#xff0c;关于 GitHub Copilot 的三个预览功能&#xff1a; Next Edit Suggestions&#xff08;NES&#xff09;Copilot Edits 的…

[qt5学习笔记]Application Example示例程序源码解析

开发环境问题 vs2022下直接打开ui、ts文件失败 解决办法如下图&#xff0c; 设置designer独立运行。估计是嵌入运行存在些许bug。 同理&#xff0c;ts编辑工具linguist也存在这个问题。 qrc rc的编辑嵌入编辑都正常&#xff0c;但分离式更稳定可靠。 qt creator编译失败 原…

RabbitMQ介绍以及基本使用

文章目录 一、什么是消息队列&#xff1f; 二、消息队列的作用&#xff08;优点&#xff09; 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…

【数据可视化-17】基于pyecharts的印度犯罪数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…