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

目录

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 formsclass 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.mzph.cn/diannao/17501.shtml

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

相关文章

期望薪资25K,新浪微博测试4轮面试,没想到过了。。

一面60min 1、离职原因 2、简单的算法题&#xff0c;就是我会什么让写什么&#xff1a; 冒泡排序&#xff0c;二分查找&#xff08;其实这么简单&#xff0c;我还是在指引下写出来的&#xff0c;自己实在太菜&#xff09; 3、简历问答&#xff08;随机抽几个点问&#xff0…

云计算期末复习(2)

MapReduce 包含Google MapReduce基本构架、Hadoop MapReduce基本构架 作业&#xff08;问答题&#xff09; &#xff08;1&#xff09;预习论文The Google File System&#xff0c;总结和分析GFS主要特点。 GFS的主要特点包括&#xff1a; 1. 高可靠性和容错性&#xff1a;G…

boot项目中定时任务quartz

最近换项目组&#xff0c;发现项目中定时任务使用的是quartz框架&#xff0c;上一篇文章[springboot定时任务]也是使用的quartz&#xff0c;只不过实现方式不同&#xff0c;于是整理下 定时任务常用方法有Quartz&#xff0c;Spring自带的Schedule框架 Quartz基础知识 quartz…

linux开发之设备树

设备树的基本概念 1.什么是设备树?为什么叫设备树呢? 设备树是描述硬件的文本文件&#xff0c;因为语法结构像树一样。所以叫设备树。 2.基本名词解释 <1>DT:Device Tree //设备树 <2>FDT:Flattened Device Tree //开放设备树&#xff0c;起源于0penFirmware(0F…

[论文笔记]Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

引言 今天带来思维链论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models的笔记。 作者探索了如何通过生成一系列中间推理步骤的思维链&#xff0c;显著提升大型语言模型在进行复杂推理时的能力。 1 总体介绍 语言模型的规模扩大已被证明能够带来…

力扣239. 滑动窗口最大值

Problem: 239. 滑动窗口最大值 文章目录 题目描述思路复杂度Code 题目描述 思路 1.编写实现优先队列类&#xff1a; 1.1.实现push(int n):将元素n添加到队列尾&#xff0c;同时将n前面大于n的元素删除 1.2.实现int max():将队列头元素取出&#xff08;由于实现了push所以此时队…

Linux基础 (十):Linux 信号的使用

目录 一、信号的基本概念 二、信号处理常见方式概览 三、修改信号的响应方式 – signal() 3.1 简单复习结束前台进程 3.2 改变SIGINT信号的响应方式 3.3 自定义方式改变进程对信号的响应 3.4 进程对信号作出两种响应 四、发送信号 – kill() 五、利用信号解决僵死进程…

2024电激世界脉动-中国汽车品牌全球化制胜手册

来源&#xff1a;奥美Ogilvy&#xff1a; 近期历史回顾&#xff1a; 2024中国宏观经济专题报告-数据要素市场建设 2023-2024年度报告.pdf 2024制药与生化医疗技术产业链白皮书.pdf 从可再生能源到绿氢-中国投资助力埃及能源转型.pdf 2024有机旅行中国行业指引.pdf 2024中国技术…

运营商系统快速上云的实践分享

运营商系统上云的背景 系统上云是数字经济发展的潮流&#xff0c;在数字化转型的浪潮中&#xff0c;上云已经成为推动各行各业创新和效率提升的关键力量。运营商作为服务行业和企业上云的服务商&#xff0c;积极响应国家号召的同时为行业上云打造案例标杆&#xff0c;自身的系统…

常用目标检测预训练模型大小及准确度比较

目标检测是计算机视觉领域中的一项重要任务&#xff0c;旨在检测和定位图像或者视频中的目标对象。当人类观看图像或视频时&#xff0c;我们可以在瞬间识别和定位感兴趣的对象。目标检测的目标是使用计算机复制这种智能。 近年来&#xff0c;目标检测网络的发展日益成熟&#…

四步简单操作:轻松将iCloud照片恢复到相册

随着智能手机的普及&#xff0c;我们的生活中越来越多的照片存储在了云端&#xff0c;其中iCloud提供了便捷的照片备份和存储服务。但有时候&#xff0c;我们可能会不小心删除了在iCloud上的照片&#xff0c;或者想要将iCloud中的照片恢复到手机相册中。 在这篇文章中&#xf…

【数据结构】快速排序(详解)

目录 快速排序 历史&#xff1a; 基本思想&#xff1a; 主框架&#xff1a; 下面解释实现单次排序的几种版本&#xff1a; 1.Hoare版本 2. 挖坑法 3. 前后指针法 快速排序的实现包括递归与非递归&#xff1a; 1. 递归实现&#xff1a;&#xff08;即开头的基本框架&am…

Jenkins安装 :AWS EC2 Linux

1 JDK11 install # 用的yum安装 # 压缩包安装&#xff0c;下载的jdk-11.0.22_linux-x64_bin.tar.gz在EC2解压&#xff0c;配置环境变量&#xff0c;运行jenkins的时候会报错$ yum -y list java-11* Available Packages java-11-amazon-corretto-devel.x86_64 …

动手学深度学习4.6 暂退法-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;丢弃法_哔哩哔哩_bilibili 本节教材地址&#xff1a;4.6. 暂退法&#xff08;Dropout&#xff09;…

LangChain技术解密:构建大模型应用的全景指南

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

使用目标检测模型YOLO V9 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

我看到YOLO V8中&#xff08;ultralytics版本8.2.18&#xff09;集成了YOLO V9&#xff0c;所以直接在YOLO V8 OBB的基础上实现YOLO V9 OBB&#xff0c;训练结果也出来了&#xff0c;但是评估指标比YOLO V8 OBB低一点点&#xff0c;不知道是不是哪里遗漏修改了......如有大神赐…

【Linux学习】进程间通信 (2) —— 信号

下面是有关进程通信中信号的相关介绍&#xff0c;希望对你有所帮助&#xff01; 小海编程心语录-CSDN博客 目录 1. 信号 1.1 概念 1.2 信号的产生 1.3 信号的处理方式 2. 函数 2.1 kill() 函数 2.2 signal()函数 2.3 sigaction()函数 2.4 sigprocmask()函数 …

文盘Rust -- 生命周期问题引发的 static hashmap 锁

100编程书屋_孔夫子旧书网 2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。 春节…

如何从Android恢复已删除的文件?3 种有效的方式

有时我们可能会错误地删除Android设备上的重要文件。更疯狂的是&#xff0c;Android手机上的文件在一夜之间消失了&#xff0c;我们不知道为什么。我们感到非常遗憾和恼火&#xff0c;但不知道。但是&#xff0c;此时学习如何从Android手机恢复已删除的文件为时已晚&#xff0c…

Excel 取出每组最后一行

Excel的前两列是两层的分组列&#xff0c;后两列是明细 ABCD1CM11112CM12123CM13134CM14145CM25156CM26167BM11218BM12229BM232310AM113111AM323212AM333313AM3434 现在要取出每小组的最后一行&#xff1a; ABCD1CM14142CM26163BM12224BM23235AM11316AM3434 使用 SPL XLL sp…