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 forms

class UserModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo
        fields = ["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, RegexValidator

class 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.UserInfo
        fields = ["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 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于大牛直播SDK的Android平台低延迟RTSP|RTMP播放与录像技术实践

技术背景 随着直播、安防监控、远程会议等场景对实时性与稳定性要求的提升&#xff0c;低延迟流媒体播放与录像成为核心技术需求。大牛直播SDK的SmartPlayer模块提供了完整的解决方案&#xff0c;支持RTSP、RTMP协议的多实例播放、硬件解码、实时快照、录像管理等功能&#xf…

小怿学习日记(七) | Unreal引擎灯光架构

灯光的布局对于HMI场景中车模的展示效果有着举足轻重的地位。本篇内容将简单介绍ES3.1的相关知识&#xff0c;再深入了解Unreal引擎中车模的灯光以及灯光架构。 一、关于ES3.1 1.1 什么是ES3.1 ES3.1这个概念对于美术的同学可能比较陌生&#xff0c;ES3.1指的是OpenGL ES3.1&…

DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在当今数字化时代&#xff0c;AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型&#xff0c;凭借其出色的性能和开源免费的优势&#xff0c;成为许多开发者的首选。今天&#xff0c;就让我们一起探索如何将DeepSeek接入PyCharm&#xff0c;实现高效、智…

广度优先搜索详解--BFS--蒟蒻的学习之路

1.什么是广度优先搜索? 广度优先搜索&#xff08;Breadth-First Search&#xff0c;简称BFS&#xff09;是一种遍历或搜索树和图的算法&#xff0c;也称为宽度优先搜索&#xff0c;BFS算法从图的某个节点开始&#xff0c;依次对其所有相邻节点进行探索和遍历&#xff0c;然后再…

. Unable to find a @SpringBootConfiguration(默认软件包中的 Spring Boot 应用程序)

解决&#xff1a; 新建一个包即可 问题&#xff1a; 默认软件包中的 Spring Boot 应用程序。 原因&#xff1a; 默认包的定义 &#xff1a; 如果一个 Java 类没有使用 package 声明包名&#xff0c;则该类会被放置在默认包中。Spring Boot 遵循 Java 的包管理约定&#xff…

DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地

对于个人开发者或尝鲜者而言&#xff0c;本地想要部署 DeepSeek 有很多种方案&#xff0c;但是一旦涉及到企业级部署&#xff0c;则步骤将会繁琐很多。 比如我们的第一步就需要先根据实际业务场景评估出我们到底需要部署什么规格的模型&#xff0c;以及我们所要部署的模型&…

“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下&#xff0c;你和远方的朋友要进行一场电话交流&#xff0c;但这通电话不仅仅是随便聊聊&#xff0c;而是要传递一封重要的信件。为了确保这…

网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施

文章目录 GRE隧道&#xff08;通用路由封装&#xff0c;Generic Routing Encapsulation&#xff09;协议号47实验&#xff1a;思科&#xff1a;开始实施&#xff1a; 华为&#xff1a;开始实施&#xff1a; eBGP实施思科&#xff1a;华为&#xff1a; GRE隧道&#xff08;通用路…

Android 动态加入Activity 时 manifest 注册报错解决。使用manifestPlaceholders 占位

需求如下&#xff1a; 项目 测试demo 有多个渠道&#xff0c;部分渠道包含支付功能&#xff0c;在主测试代码外&#xff0c;需要一个单独 Activity 调用测试代码。 MainActivityPayActivity渠道A包含不包含渠道B包含包含 因为支付功能需要引入对应的 moudule&#xff0c;因此…

【koa】05-koa+mysql实现数据库集成:连接和增删改查

前言 前面我们已经介绍了第二阶段的第1-4点内容&#xff0c;本篇介绍第5点内容&#xff1a;数据库集成&#xff08;koamysql&#xff09; 也是第二阶段内容的完结。 一、学习目标 在koa项目中正常连接数据库&#xff0c;对数据表进行增删改查的操作。 二、操作步骤 本篇文章…

linux--关于makefile

makefile文件 可以指定编译顺序&#xff0c;这样方便一个项目的多个文件要编译的挨个操作的麻烦。 makefile文件的命名&#xff1a;makefile 或者 Makefile 必须是这俩&#xff0c;系统才能识别 规则的书写语法如下&#xff1a; 一个makefile内可以有多个规则 目标:依赖a 依…

俄罗斯方块游戏完整代码示例

以下是一个基于Cocos Creator引擎开发的俄罗斯方块游戏的完整代码示例。该游戏实现了俄罗斯方块的基本功能&#xff0c;并且代码整合在单个文件中&#xff0c;无需任何外部依赖&#xff0c;可以直接在浏览器中运行。 1. 创建Cocos Creator项目 首先&#xff0c;确保你已经安装了…

学习kafka和flink

kafka kafka安装一套流程 方法一&#xff1a;启动需安装zookeeper和kafka 【Kafka】Windows下安装Kafka&#xff08;图文记录详细步骤&#xff09; 安装Tzq2018写的上面链接安装的&#xff0c;一切很顺利&#xff0c;除了zookeeper的环境变量不管如何配置都不管用&#xff0…

SLT-加载表添加字段重新刷数

1、LTRC数据提供->输入表名->停止加载/复制 2、LTRS添加表字段&#xff08;只有在加载部分字段的情况下&#xff09;&#xff1b; 在查看修改概览页将需要的字段选中并删除&#xff0c;删除的字段自动归集到已修改概览里。 3、数据提供-》输入表名-》创建/数据库视图&am…

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

【黑马点评优化】2-Canel实现多级缓存&#xff08;RedisCaffeine&#xff09;同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…

【iOS】SwiftUI状态管理

State ObservedObject StateObject 的使用 import SwiftUIclass CountModel: ObservableObject {Published var count: Int 0 // 通过 Published 标记的变量会触发视图更新init() {print("TimerModel initialized at \(count)")} }struct ContentView: View {State…

组合总和力扣--39

目录 题目 思路 剪枝优化 代码 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的…

基于知识图谱的问答系统:后端Python+Flask,数据库Neo4j,前端Vue3(提供源码)

基于知识图谱的问答系统&#xff1a;后端PythonFlask&#xff0c;数据库Neo4j&#xff0c;前端Vue3 引言 随着人工智能技术的不断发展&#xff0c;知识图谱作为一种结构化的知识表示方式&#xff0c;逐渐成为问答系统的重要组成部分。本文将介绍如何构建一个基于知识图谱的问答…

【第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025】网络安全,人工智能,数字经济的研究

重要信息 会议官网&#xff1a;www.csaide.net 会议时间&#xff1a;2025年3月7-9日 会议地点&#xff1a;马来西亚-马来西亚理工大学新山校区&#xff08;线上线下混合&#xff09; 简介 过去几年&#xff0c;数字经济蓬勃发展&#xff0c;已成为全球经济增长的驱动力。…

VSCode AI提效工具,通义灵码前端开发体验

安装 安装依旧很简单&#xff0c;vs code拓展插件中搜索就出来了&#xff0c;记住下边这个图标。 亮点 新接入了deepseek-v3\deepseek-r1模型&#xff0c;不仅支持智能问答&#xff0c;而且增加了AI程序员&#xff0c;可以直接按照完成编码任务&#xff0c;修改优化代码&am…