当前位置: 首页 > article >正文

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 


http://www.kler.cn/a/553945.html

相关文章:

  • 全面掌握Python时间处理
  • DeepSeek 云原生分布式部署的深度实践与疑难解析—— 从零到生产级落地的全链路避坑指南
  • 跳表(Skip List)详解
  • 基于YOLOv8的人脸识别系统
  • AI驱动的精准教育:个性化学习新时代
  • 提升接口性能之异步
  • 在ubuntu上用Python的openpyxl模块操作Excel的案例
  • 深度学习之自然语言处理CBOW预测及模型的保存
  • 深度神经网络终极指南:从数学本质到工业级实现(附Keras版本代码)
  • 二级指针略解【C语言】
  • mac下使用webstorm监听less文件自动生成wxss文件
  • 内核数据结构用法(2)list
  • Kubernetes: Kustomize 进阶, 使用 Patch 精准操控 ConfigMap 多行文本,实现配置参数化
  • 【JavaWeb10】服务器渲染技术 --- JSP
  • 51c深度学习~合集2
  • Rust中的Trait与Trait Bounds
  • C++时之律者的代码掌控:日期类计算器万字详解
  • 仿 Sora 之形,借物理模拟之技绘视频之彩
  • 嵌入式面试高频面试题:嵌入式系统调试方法大全
  • Mysql基础语句