3-Django项目继续--初识ModelForm

news2024/11/18 5:58:04

目录

ModelForm

认识ModelForm

优势

初识Form

初识ModelForm

添加信息

views.py

add_student_new.html

修改信息

views.py

views.py

add_student_new.html


ModelForm

认识ModelForm

  • 优势

    • 1、方便校验用户提交的数据

    • 2、页面展示错误提示

    • 3、数据库字段很多的情况下,每个字段无需手写.

    • 4、关联数据,无需手动获取.

  • 初识Form

    from django import forms
    class Add_Student(forms.Form):
        user = forms.CharField(widget=forms.TextInput)
        pwd = forms.CharField(widget=forms.PasswordInput)
    ​
    def add_student_form(request):
        form = Add_Student()
        return render(request, "stu_data/add_stu_new.html",{"form":form})

  • 初识ModelForm

  • from django import forms
    ​
    class Add_Student(forms.ModelForm):
        class Meta:
            model = models.Student
            # 获取数据表当中的字段
            # fields = ["name", "age", "gender"]
            # 获取全部字段
            fields = "__all__"
            # 给字段单独添加属性
            # widgets = {
            #     "name": forms.TextInput(attrs={"class":"form-control"}),
            #     "age": forms.TextInput(attrs={"class":"form-control"}),
            #     "gender": forms.TextInput(attrs={"class":"form-control"})
            # }

添加信息

  • views.py

    class Add_Student(forms.ModelForm):
        class Meta:
            model = models.Student
            # 获取数据表当中的字段
            # fields = ["name", "age", "gender"]
            # 获取全部字段
            fields = "__all__"
            # 给字段单独添加属性
            # widgets = {
            #     "name": forms.TextInput(attrs={"class":"form-control"}),
            #     "age": forms.TextInput(attrs={"class":"form-control"}),
            #     "gender": forms.TextInput(attrs={"class":"form-control"})
            # }
    ​
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # name是输入框上面的名字
            # field 是输入框
            for name, field in self.fields.items():
                field.widget.attrs = {"class": "form-control", "autocomplete": "off"}
    ​
    ​
    def add_student_form(request):
        if request.method == "GET":
            form = Add_Student()
            # print(form)
            return render(request, "stu_data/add_stu_new.html", {"form": form})
    ​
        # 获取post请求提交的数据
        form = Add_Student(data=request.POST)
        # 校验数据的完整性
        if form.is_valid():
            # 保存到数据表
            form.save()
            return redirect("/class/data/")
        return render(request, "stu_data/add_stu_new.html", {"form": form})
  • add_student_new.html

    {% extends "index/index.html" %}
    {% load static %}
    ​
    {% block content %}
        <div class="container">
            <div class="panel panel-success">
                <div class="panel-heading">
                    <h3 class="panel-title">添加信息</h3>
                </div>
                <div class="panel-body">
                    <div class="form-group">
                        <form method="post" novalidate>
                            {% csrf_token %}
                            {% for item in form %}
                                <label for="exampleInputEmail1" class="col-sm-2" >{{ item.label }}</label>
                                {{ item }}
                                <span style="color: red">{{ item.errors.0 }}</span>
                            {% endfor %}
                            <button type="submit" class="btn btn-success">提交</button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    ​
    {% endblock %}
    ​
    {% block js %}
    {#    <script src="{% static 'js/layui.js' %}"></script>#}
    {#    <script>#}
    {#        layui.use(function () {#}
    {#            var laydate = layui.laydate;#}
    {#            // 渲染#}
    {#            laydate.render({#}
    {#                elem: '#id_class_time'#}
    {#            });#}
    {#        });#}
    {#    </script>#}
    {% endblock %}

修改信息

  • views.py

    def modify_student(request, nid):
        title = "修改信息"
        obj = models.Student.objects.filter(id=nid).first()
        if request.method == "GET":
            form = Add_Student(instance=obj)
            return render(request, "stu_data/add_stu_new.html", {"form": form,"title":title})
    ​
        form = Add_Student(data=request.POST, instance=obj)
        if form.is_valid():
            form.save()
            return redirect("/class/data/")
        return render(request, "stu_data/add_stu_new.html", {"form": form, "title": title})

views.py

from django.shortcuts import render, redirect
from demo_one import models

.
.
.


from django import forms


class Add_Student(forms.ModelForm):
    class Meta:
        model = models.Student
        # 获取数据表当中的字段
        # fields = ["name", "age", "gender"]
        # 获取全部字段
        fields = "__all__"
        # 给字段单独添加属性
        # widgets = {
        #     "name": forms.TextInput(attrs={"class":"form-control"}),
        #     "age": forms.TextInput(attrs={"class":"form-control"}),
        #     "gender": forms.TextInput(attrs={"class":"form-control"})
        # }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # name是输入框上面的名字
        # field 是输入框
        for name, field in self.fields.items():
            field.widget.attrs = {"class": "form-control", "autocomplete": "off"}


def add_student_form(request):
    title = "添加信息"
    if request.method == "GET":
        form = Add_Student()
        # print(form)
        return render(request, "stu_data/add_stu_new.html", {"form": form,"title":title})

    # 获取post请求提交的数据
    form = Add_Student(data=request.POST)
    # 校验数据的完整性
    if form.is_valid():
        # 保存到数据表
        form.save()
        return redirect("/class/data/")
    return render(request, "stu_data/add_stu_new.html", {"form": form})


# class Modify_Student(forms.ModelForm):
#     class Meta:
#         model = models.Student
#         # 获取数据表当中的字段
#         fields = ["name"]
#         # 获取全部字段
#         # fields = "__all__"
#         # 给字段单独添加属性
#         # widgets = {
#         #     "name": forms.TextInput(attrs={"class":"form-control"}),
#         #     "age": forms.TextInput(attrs={"class":"form-control"}),
#         #     "gender": forms.TextInput(attrs={"class":"form-control"})
#         # }
#
#     def __init__(self, *args, **kwargs):
#         super().__init__(*args, **kwargs)
#         # name是输入框上面的名字
#         # field 是输入框
#         for name, field in self.fields.items():
#             field.widget.attrs = {"class": "form-control", "autocomplete": "off"}

# 修改信息

def modify_student(request, nid):
    title = "修改信息"
    obj = models.Student.objects.filter(id=nid).first()
    if request.method == "GET":
        form = Add_Student(instance=obj)
        return render(request, "stu_data/add_stu_new.html", {"form": form,"title":title})

    form = Add_Student(data=request.POST, instance=obj)
    if form.is_valid():
        form.save()
        return redirect("/class/data/")
    return render(request, "stu_data/add_stu_new.html", {"form": form, "title": title})


add_student_new.html

{% extends "index/index.html" %}
{% load static %}

{% block content %}
    <div class="container">
        <div class="panel panel-success">
            <div class="panel-heading">
                <h3 class="panel-title">{{ title }}</h3>
            </div>
            <div class="panel-body">
                <div class="form-group">
                    <form method="post" novalidate>
                        {% csrf_token %}
                        {% for item in form %}
                            <label for="exampleInputEmail1" class="col-sm-2" >{{ item.label }}</label>
                            {{ item }}
                            <span style="color: red">{{ item.errors.0 }}</span>
                        {% endfor %}
                        <button type="submit" class="btn btn-success">提交</button>
                    </form>
                </div>
            </div>
        </div>
    </div>

{% endblock %}

{% block js %}
{#    <script src="{% static 'js/layui.js' %}"></script>#}
{#    <script>#}
{#        layui.use(function () {#}
{#            var laydate = layui.laydate;#}
{#            // 渲染#}
{#            laydate.render({#}
{#                elem: '#id_class_time'#}
{#            });#}
{#        });#}
{#    </script>#}
{% endblock %}

--这样在提交数据的时候就不会直接报错了...

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

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

相关文章

基于Docker的ROS开发

本文主要介绍如何使用Docker在Windows和Linux环境中部署并使用ROS&#xff0c;通过Docker Container运行ROS&#xff0c;可以方便我们在一个本地环境中运行多个ROS版本。 更多内容&#xff0c;访问专栏目录获取实时更新。 关于ROS的版本 参考ROS1 Distribution Wiki和ROS2 Dis…

SpringBoot项目启动时提示程序包不存在和找不到符号

一、前言 最近接手同事开发的一个Springboot工作项目&#xff0c;从svn上整体拉取下来后&#xff0c;构建完成后&#xff0c;启动的时候遇到了程序包找不到的情况&#xff0c;记录一下处理过程&#xff1b; 二、项目问题 1、报错信息&#xff1a;启动后报 java: 程序包org.sp…

最强端侧多模态模型MiniCPM-V 2.5,8B 参数,性能超越 GPT-4V 和 Gemini Pro

前言 近年来&#xff0c;人工智能领域掀起了一股大模型热潮&#xff0c;然而大模型的巨大参数量级和高昂的算力需求&#xff0c;限制了其在端侧设备上的应用。为了打破这一局限&#xff0c;面壁智能推出了 MiniCPM 模型家族&#xff0c;致力于打造高性能、低参数量的端侧模型。…

【Qt秘籍】[004]-Qt中的重要工具-介绍

QtCreator概览 当我们打开系统的菜单翻到刚刚下载的Qt文件&#xff0c;里面的内容却让我们眼花缭乱。 不过别急&#xff0c;下面我们将一一解析。 1.Assistant Qt自带的离线版本官方文档 2.Designer Qt图形化设计界面的工具&#xff0c;通过拖拽控件快速生成界面&#xff0c…

APM 2.8外置罗盘校准

请注意&#xff1a; GPS不可以飞控带电插拔&#xff0c;带电插拔会产生差分电压&#xff0c;可能会导致GPS模块损坏&#xff0c;无法搜星。不听劝告&#xff0c;后果自负&#xff01; 1.如何接线 GPS有两根线&#xff0c;要插上面图所示的两个接口。同时拔掉旁边的跳线帽&…

强化学习——学习笔记2

在上一篇文章中对强化学习进行了基本的概述&#xff0c;在此篇文章中将继续深入强化学习的相关知识。 一、什么是DP、MC、TD&#xff1f; 动态规划法&#xff08;DP&#xff09;&#xff1a;动态规划法离不开一个关键词&#xff0c;拆分 &#xff0c;就是把求解的问题分解成若…

[AIGC] Nginx常用变量详解

Nginx非常强大&#xff0c;其主要功能包括HTTP服务器、反向代理、负载均衡等。Nginx的配置中有许多内置的变量&#xff0c;你可以在配置文件中使用这些变量进行灵活的配置。在本篇文章中&#xff0c;我们将介绍一些Nginx中常见的变量&#xff0c;包括proxy_add_header。 常见变…

多旋翼无人机机场考哪些内容?

多旋翼无人机机场考试的内容主要包括理论和实飞两部分。 理论考试主要涵盖无人机相关的知识&#xff0c;包括无人机的原理、结构、操作规范等。 实飞考试则主要考察飞行技能&#xff0c;包括飞行操作、航线规划、飞行稳定性等。 具体来说&#xff0c;实飞部分可能包括使用GPS…

前端渲染页面的原理

之前一直不愿意写一篇关于原理的&#xff0c;因为说起来实在是太繁杂&#xff0c;要写得细&#xff0c;码字梳理&#xff0c;计算下来起码都要差不多三周。以前一直躲避这个事情&#xff0c;现在反正有时间&#xff0c;为了不荒废自己&#xff0c;那就从头捋一遍。也方便自己后…

【STL库源码剖析】list 简单实现

从此音尘各悄然 春山如黛草如烟 目录 list 的结点设计 list 的迭代器 list 的部分框架 迭代器的实现 容量相关相关函数 实现 insert 在指定位置插入 val 实现 push_back 在尾部进行插入 实现 erase 在指定位置删除 实现 pop_back 在尾部进行删除 实现 list 的头插、头删 实现…

循环buffer“一写多读“

1.往期回顾 一个简单实用的循环buffer&#xff0c;用于缓冲数据&#xff01;测试500M数据&#xff0c;耗时1.3秒。 C语言版本的循环buffer比C版本的速度更快&#xff01;测试500M数据0.5秒&#xff0c;达9.25Gbps左右&#xff01; C 语言免拷贝版本循环 buffer 比拷贝版本快了…

熵值法(熵权法)

熵值法&#xff08;Entropy Method&#xff09;是一种多属性决策分析方法&#xff0c;主要用于权重确定、排序和评价。它在风险评估、资源配置、环境管理等领域得到广泛应用。熵值法的核心思想是基于信息熵的概念&#xff0c;利用信息熵来度量各属性对决策的贡献程度&#xff0…

农产品产品防伪防窜货+二维码防伪+溯源系统源码全平台一物一码数字化防伪防窜货和溯源查询系统

农产品产品防伪防防窜货二维码防伪溯源系统源码全平台一物一码数字化防伪防窜货和溯源查询系统 产品防伪防防窜货二维码防伪溯源系统源码&#xff0c;该系统采用最简单易用的phpMySQL进行搭建&#xff0c;拥有完善的网站前后台&#xff0c;通过对每件产品生产线上的单品、二级…

BIGO前端CICD平台

本文首发于&#xff1a;https://github.com/bigo-frontend/blog/ 欢迎关注、转载。 我是谁 BIGO前端CICD平台&#xff0c;是一个服务于前端团队的全研发周期管理平台&#xff0c;已经是我们团队日常都要使用的工具了。 该平台实现了一键创建项目、发布编排、新建迭代、checkl…

【微服务】部署mysql集群,主从复制,读写分离

两台服务器做如下操作 1.安装mysqldocker pull mysql:5.72.启动以及数据挂载 mkdir /root/mysql/data /root/mysql/log /root/mysql/conf touch my.conf //mysql的配置文件docker run --name mysql \ -e MYSQL_ROOT_PASSWORD123456 \ -v /root/mysql/data:/var/lib/mysql \ -v…

如何创建一个vue项目?详细教程,如何创建第一个vue项目?

已经安装node.js在自己找的到的地方新建一个文件夹用于存放项目&#xff0c;记住文件夹的存放路径&#xff0c;以我为例&#xff0c;我的文件夹路径为D:\tydic 打开cmd命令窗口&#xff0c;进入刚刚的新建文件夹 切换硬盘&#xff1a; D: 进入文件夹&#xff1a;cd tydic 使…

基于ViutualBox+Ubuntu(Linux)的开发环境搭建

实际在选择虚拟机的时候纠结了要用virualbox还是vmware&#xff0c;初步比较结果&#xff1a; 1.virualbox能够使用vmware的硬盘格式&#xff0c;因此可以自由选择。 2.都能够实现主机和宿主机之间的文件夹共享。 3.virualbox是自由软件&#xff0c;vmware是商业软件。 在功能上…

STM32 入门教程(江科大教材)#笔记2

3-4按键控制LED /** LED.c**/ #include "stm32f10x.h" // Device headervoid LED_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_I…

go 微服务框架kratos使用中间件的方法

一、中间件的概念 在go语言中&#xff0c;中间件是一种用于处理http请求的开发模式&#xff0c;允许开发人员在请求到达处理程序之前或之后执行特定的操作&#xff0c;如日志记录、身份验证、错误处理等。 中间件通常是一个函数&#xff0c;它接收一个 http.Handler 作为参数…

解读makefile中$(patsubst pattern,replacement,text)

在 Makefile 中&#xff0c;$(patsubst pattern,replacement,text) 是一个用于模式替换的函数&#xff0c;它可以将文本中符合指定模式的部分替换为指定的字符串。这个函数通常用于对文件名或路径进行模式匹配和替换&#xff0c;非常适合在 Makefile 中进行文件名的转换操作。 …