Django006:ModelForm组件

news2025/1/23 6:03:11

 大家好,我是csdn的博主:lqj_本人

这是我的个人博客主页:

lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm=1011.2415.3001.5343哔哩哔哩欢迎关注:小淼Develop

小淼Develop的个人空间-小淼Develop个人主页-哔哩哔哩视频

本篇文章主要讲述:快速上手,pythonweb开发Django框架

目录

传统方法的痛点

ModelForm组件

前提(models.py)

信息校验

views.py

user_model_form_add.html

将自动校验设为中文

setting.py

添加信息页面校验信息提示

前端复写

views.py

user_model_form_add.html

关联数据(编辑页面为例)

user_edit.html

编辑页面效果


传统方法的痛点

  1. 用户提交数据没有校验。
  2. 页面上,每一个字段都需我们重写一遍。
  3. 关联的数据,手动去获取并展示循环展示再页面。

基于以上的痛点,我们在使用Django开发的时候就可以引用ModelForm组件,他是Django中特有的,并在传统的开发的步骤的基础上,优化了以上总结的痛点。

ModelForm组件

前提(models.py)

from django.db import models


class BMB(models.Model):
    """ 部门表 """
    title = models.CharField(verbose_name='部门', max_length=32)

    def __str__(self):
        return self.title

class YGB(models.Model):
    """ 员工表 """
    name = models.CharField(verbose_name="姓名", max_length=16)
    password = models.CharField(verbose_name="密码", max_length=64)
    age = models.IntegerField(verbose_name="年龄")
    account = models.DecimalField(verbose_name="账户余额", max_digits=10, decimal_places=2, default=0)
    create_time = models.DateField(verbose_name="入职时间")
    depart = models.ForeignKey(verbose_name="部门",to="BMB", to_field="id", on_delete=models.CASCADE)
models.ForeignKey(to="BMB",to_fields="id",null=True,blank=True,on_delete=models.SET_NULL)

    gender_choices = (
        (1, "男"),
        (2, "女")
    )
    gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)

信息校验

views.py

其中:name = forms.CharField(min_length=3, label="用户名")

说明:通过上面的name再在自动校验name字段是否由内容的同时同时校验name字段输入最小的字段不小3个字符。

if form.is_valid():
        # 如果数据合法保存到数据库
        form.save() 

说明:如果校验成功,通过form.save()直接保存到数据库(比传统的存入方式简便,增加了代码的可读性。)

from django import forms


class UserModelForm(forms.ModelForm):
    name = forms.CharField(min_length=3, label="用户名")

    class Meta:
        model = models.YGB
        fields = ['name', 'password', 'age', 'account', 'create_time', 'gender', 'depart']


def user_model_form_add(request):
    """添加用户(ModelForm组件版本"""
    if request.method == "GET":
        form = 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

{% extends 'layout.html' %}

{% block content %}
    <form method="post" novalidate>
    {% csrf_token %}
        {% for obj in form %}
            <div style="display: flex;flex-direction: column;width: 500px">
                {{ obj.label }}:{{ obj }}
            </div>
            <span style="color: red">{{ obj.errors.0 }}</span>
        {% endfor %}
    <button type="submit">立即创建</button>
    </form>
{% endblock %}

将自动校验设为中文

setting.py

LANGUAGE_CODE = 'zh-hans'

添加信息页面校验信息提示

前端复写

views.py

from django import forms


class UserModelForm(forms.ModelForm):
    name = forms.CharField(min_length=3, label="用户名")

    class Meta:
        model = models.YGB
        fields = ['name', 'password', 'age', 'account', 'create_time', 'gender', 'depart']


def user_model_form_add(request):
    """添加用户(ModelForm组件版本"""
    if request.method == "GET":
        form = 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

通过以下方法将views.py中的form接收并循环到前端html(复写了html的同时代替原本传统的前端html的编写)

        {% for obj in form %}
            <div style="display: flex;flex-direction: column;width: 500px">
                {{ obj.label }}:{{ obj }}
            </div>
            <span style="color: red">{{ obj.errors.0 }}</span>
        {% endfor %}

注意:此方法只是用Django框架,所以若用Django写全栈的话是非常不错的选择。

           但是,若想前后端分离,只想让Django写后端的话,此方法不是最佳选择。

{% extends 'layout.html' %}

{% block content %}
    <form method="post" novalidate>
    {% csrf_token %}
        {% for obj in form %}
            <div style="display: flex;flex-direction: column;width: 500px">
                {{ obj.label }}:{{ obj }}
            </div>
            <span style="color: red">{{ obj.errors.0 }}</span>
        {% endfor %}
    <button type="submit">立即创建</button>
    </form>
{% endblock %}

关联数据(编辑页面为例)

通过以下方法快速关联数据库中的每一行的数据:

row_obj = models.YGB.objects.filter(id=nid).first()
form = UserModelForm(data=request.POST, instance=row_obj)

instance=row_obj与filter(id=nid)说明:用传递的nid参数做标识,用instance指定此标识所在的数据行。

from django import forms


class UserModelForm(forms.ModelForm):
    name = forms.CharField(min_length=3, label="用户名")

    class Meta:
        model = models.YGB
        fields = ['name', 'password', 'age', 'account', 'create_time', 'gender', 'depart']
def user_edit(request, nid):
    """编辑用户"""
    row_obj = models.YGB.objects.filter(id=nid).first()
    if request.method == 'GET':
        form = UserModelForm(instance=row_obj)
        return render(request, 'user_edit.html', {'form': form})

    form = UserModelForm(data=request.POST, instance=row_obj)
    if form.is_valid():
        # 如果数据合法保存到数据,如果想要保存不需要用户输入的默认值
        # form.instance.<字段名> = 值
        form.save()
        return redirect('/user/list/')
    else:
        return render(request, 'user_edit.html', {"form": form})

user_edit.html

{% extends 'layout.html' %}

{% block content %}
    <form method="post" novalidate>
    {% csrf_token %}
        {% for obj in form %}
            {{ obj.label }}:{{ obj }}
            <span style="color: red">{{ obj.errors.0 }}</span>
        {% endfor %}
    <button type="submit">修改信息</button>
    </form>
{% endblock %}

编辑页面效果

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

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

相关文章

SpringBoot @Async异步线程 + CompletableFuture使用

参考资料 SpringBoot 最简单的使用异步线程案例 AsyncSpringboot Async异步扩展使用 结合 CompletableFuture 目录 一. 配置线程池二. 耗时任务1三. 耗时任务2四. 调用 一. 配置线程池 当池子大小小于corePoolSize&#xff0c;就新建线程&#xff0c;并处理请求当池子大小等于…

[golang gin框架] 31.Gin 商城项目- 提交订单逻辑操作以及去支付页面制作

一.界面展示 确认订单页面 确认订单页面相关逻辑见 golang gin框架] 30.Gin 商城项目- 购物车商品确认页面以及收货地址的增删改查 点击 去支付按钮逻辑: (1).判断用户是否存在地址,不存在则新增并设置为默认地址 (2).点击去支付,请求提交订单执行结算操作: 订单执行结算操作步…

C语言-【移位操作符详解】

这篇文章主要介绍了C语言中移位操作符&#xff0c;文章中通过详细的代码以及有关计算机中零碎的知识点对移位操作符进行了一个更好的解释&#xff0c;需要的小伙伴们可以一起学习学习吖&#xff5e; 移位操作符:移动的是补码的二进制序列。 在C语言当中&#xff0c;有两种移位…

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五 引言&#x1f349;句1: The color green is natural for trees and grass.成分划分弱读语调 &#x1f349;句2: But it is an unnatural color for humans.成分划分弱读连读语调 &#x1f349;句3: A person who h…

React | React组件化开发(二)

✨ 个人主页&#xff1a;CoderHing &#x1f5a5;️ React .js专栏&#xff1a;React .js React组件化开发(二) &#x1f64b;‍♂️ 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f4ab; 系列专栏&#xff1a;吊打面试官系列 16天学会Vue 11天学会React …

【TOP生物信息】使用SingleR注释细胞类型

扫码关注下方公粽号&#xff0c;回复推文合集&#xff0c;获取400页单细胞学习资源&#xff01; 本文共计1887字&#xff0c;阅读大约需要6分钟&#xff0c;目录如下&#xff1a; SingleR基本介绍 SingleR包安装 SingleR包使用 1.使用已有的参考数据集进行细胞定义2.使用自定…

NAS内网穿透

3)可用方法1&#xff1a;Tailscale&#xff08;免费&#xff09; Tailscale 是一种基于 WireGuard 的虚拟组网工具 下面教大家安装&#xff1a; 镜像仓库搜索&#xff1a;tailscale&#xff0c;就是第一个 下载之后安装配置注意&#xff1a; 1&#xff09;要把权限全部打开…

C++游戏服务器框架笔记(四)_封装Select

C游戏服务器框架笔记(一)_封装数据包类 C游戏服务器框架笔记(二)_封装Socket类 C游戏服务器框架笔记(三)_封装ByteBuffer类 C游戏服务器框架笔记(四)_封装Select 因为设想的次系列服务器主要应用场景是linux系统下&#xff0c;支持Windows系统是为了更好的调试和开发&#x…

【sqlite】联查Join更新

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

虚拟化技术 — 虚拟机迁移

目录 文章目录 目录Libvirt 的 Live Migration(热迁移)网络数据传输层控制层Pre-Copy Live MigrationLibvirt 的 Live Migration(热迁移) Libvirt 的 Live Migration 主要分为 “数据“ 和 “控制“ 这两个层面的内容。 网络数据传输层 基于 Hypervisor 的传输:两个 Hyp…

MiniGPT-4 笔记

目录 简介 实现方法 效果及局限 参考资料 简介 MiniGPT-4 是前段时间由KAUST&#xff08;沙特阿卜杜拉国王科技大学&#xff09;开源的多模态大模型&#xff0c;去网站上体验了一下功能&#xff0c;把论文粗略的看了一遍&#xff0c;也做个记录。 论文摘要翻译&#xff1…

【图】DFS、BFS遍历

图有两种遍历方式&#xff1a;DFS深度优先&#xff0c;BFS广度优先。 把所有顶点访问一遍&#xff0c;且每个顶点只访问一次&#xff0c;把走过的顶点标记一下。 标记&#xff1a;为图设置一个访问标志数组visited[n&#xff3d;&#xff0c;用于标示图中每个顶点是否被访问过…

C++引用()笔记

C引用(&)笔记 1.寄存器一般只有4/8个字节&#xff0c;所以返回时候的中间变量(下图的临时变量)不一定是储存在寄存器当中 2.传引用返回可以减少拷贝&#xff0c;增加效率 但运行打印会出错的&#xff0c;因为当栈帧销毁的时候&#xff0c;清理栈帧就会得到随机值 正确表达…

西宾蜻蜓FM语音下载(qingtingdown)

一、介绍 西宾蜻蜓FM语音下载&#xff08;qingtingdown&#xff09;&#xff0c;能够帮助你下载蜻蜓FM音频节目。如果你是蜻蜓FM会员&#xff0c;它还能帮你下载会员节目。 二、下载地址 本站下载&#xff1a;西宾蜻蜓FM语音下载&#xff08;qingtingdown&#xff09; 百度…

PSP - AlphaFold2 适配不同来源搜索的 MSA 接口

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130594303 MSA (Multiple Sequence Alignment) 在 AlphaFold2 中的工作方式如下: 使用搜索工具 (hhblits/hhsearch/jackhmmer),从大型数据库中,搜索与目标…

从零开始学习JVM(二)--类加载子系统

1. 类加载子系统介绍 JVM内存结构如下图所示&#xff1a; 程序计数器&#xff08;PC寄存器&#xff09;&#xff1a;程序计数器是⼀块⼩的内存空间&#xff0c;可以看作是当前线程所执⾏的字节码的⾏号指示器。字节码解释器⼯作时通过改变这个计数器的值来选取下⼀条需要执⾏…

PyTorch读取数据集全部进内存,使网络的训练速度提高10倍以上!!!

正常情况下&#xff0c;torch读取数据的时候是Batch Size小批量读取。首先找到所有数据集的路径保持到一个变量中&#xff0c;之后需要读取哪个数据的时候&#xff0c;就根据这个变量中的路径索引去读取。因为硬件的限制&#xff0c;从硬盘中读取数据到显存中所花的时间要远远大…

计算机体系结构实验一

计算机体系结构实验一 一.实验目的 ​理解RISC-V的指令执行的数据流和控制信号&#xff0c;熟悉指令流水线的工作过程。 二.实验过程 1.RISC-V的相关指令 实验的模拟器使用RISC-V指令集&#xff0c;为了便于后续分析&#xff0c;首先学习实验中使用的RISC-V指令。 基本RIS…

Cesium最新版使用天地图地形及注记服务

天地图三维地名服务和地形服务需要利用 cesium 开源三维地球API与天地图扩展插件共同使用&#xff0c;目前支持cesuim1.52、1.58、1.63.1。 天地图调用demo: http://lbs.tianditu.gov.cn/docs/#/sanwei/ 注意&#xff1a; demo里的地形服务地址不对&#xff0c;需要自己更换成…

MCU通用移植方案

MCU通用移植方案 目录 MCU通用移植方案前言1 硬件移植2 软件移植2.1 底层移植方法2.1.1 移植原理2.1.2 移植方法 2.2 中间层移植方法2.2.1 移植原理2.2.2 移植方法 2.3 两种移植方法比对 3 结束语 前言 因为项目的需求或者成本控制等因素&#xff0c;我们经常会遇到更换MCU的情…