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.rhkb.cn/news/333989.html

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

相关文章

企业文件加密实现数据泄露防护

在数字化时代&#xff0c;数据成为企业最宝贵的资产之一。然而&#xff0c;数据泄露事件频发&#xff0c;给企业带来了巨大的经济损失和声誉风险。为了保护企业的核心利益&#xff0c;实现数据泄露防护&#xff0c;企业必须采取有效的文件加密措施。 一、数据泄露的严重性 数据…

SQL——SELECT相关的题目(力扣难度等级:简单)

目录 197、上升的温度 577、员工奖金 586、订单最多的客户 596、超过5名学生的课 610、判断三角形 620、有趣的电影 181、超过经理收入的员工 1179、重新格式化部门表&#xff08;行转列&#xff09; 1280、学生参加各科测试的次数 1965、丢失信息的雇员 1068、产品销售分…

python核心编程(二)

python面向对象 一、基本理论二、 面向对象在python中实践2.1 如何去定义类2.2 通过类创建对象2.3 属性相关2.4 方法相关 三、python对象的生命周期,以及周期方法3.1 概念3.2 监听对象的生命周期 四、面向对象的三大特性4.1 封装4.2 继承4.2.1 概念4.2.1 目的4.2.2 分类4.2.3 t…

spring boot打的包直接运行

Spring Boot 提供了一个插件 spring-boot-maven-plugin 把程序打包成一个可执行的jar包&#xff0c;直接执行java -jar xxx.jar即可以启动程序 1、引用 spring-boot-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot<…

使用 Supabase 的 Realtime + Storage 非常方便呢

文章目录 &#xff08;一&#xff09;Supabase&#xff08;二&#xff09;Realtime&#xff08;消息&#xff09;&#xff08;2.1&#xff09;Python 消息订阅&#xff08;2.2&#xff09;JavaScript 消息订阅 &#xff08;三&#xff09;Storage&#xff08;存储&#xff09;&…

CI/CD:持续集成/持续部署

1. 安装docker、docker-compose # 安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i sdownload.docker.commirrors.aliyun.com/docker-ce /…

『ZJUBCA Weekly Feed 07』MEV | AO超并行计算机 | Eigen layer AVS生态

一文读懂MEV&#xff1a;区块链的黑暗森林法则 01 &#x1f4a1;TL;DR 这篇文章介绍了区块链中的最大可提取价值&#xff08;MEV&#xff09;概念&#xff0c;MEV 让矿工和验证者通过抢先交易、尾随交易和三明治攻击等手段获利&#xff0c;但也导致网络拥堵和交易费用增加。为了…

c++(四)

c&#xff08;四&#xff09; 运算符重载可重载的运算符不可重载的运算符运算符重载的格式运算符重载的方式友元函数进行运算符重载成员函数进行运算符重载 模板定义的格式函数模板类模板 标准模板库vector向量容器STL中的listmap向量容器 运算符重载 运算符相似&#xff0c;运…

Android刮刮卡自定义控件

效果图 刮刮卡自定义控件 import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import …

Linux--进程间通信(1)(匿名管道)

目录 1.了解进程通信 1.1进程为什么要通信 1.2 进程如何通信 1.3进程间通信的方式 2.管道 2.1管道的初步理解 2.2站在文件描述符的角度-进一步理解管道 2.3 管道的系统调用接口&#xff08;匿名管道&#xff09; 2.3.1介绍接口函数&#xff1a; 2.3.2编写一个管道的代…

AI Agent教育行业落地案例

【AI赋能教育】揭秘Duolingo背后的AI Agent&#xff0c;让学习更高效、更有趣&#xff01; ©作者|Blaze 来源|神州问学 引言 随着科技的迅猛发展&#xff0c;人工智能技术已经逐步渗透到我们生活的各个方面。而随着AI技术的广泛应用&#xff0c;教育培训正引领着一场新的…

微软语音使用小计

简介 使用微软语音可以实现语音转文字和文字转语音。测试了下&#xff0c;使用还是挺方便的。 使用微软语音有两种方式。一种是使用命令行的形式&#xff0c;另一种是调用SDK的方式。 适合使用语音 CLI 的情况&#xff1a; 想在极少设置且无需编写代码的情况下试验语音服务…

Vulnhub靶机 whowantsobeking :1 打靶 渗透详细过程(萌新)

Vulnhub靶机搭建配置 先搭建vulnhub靶机&#xff1a;https://www.vulnhub.com/entry/who-wants-to-be-king-1,610/ 下载镜像之后whowantsobeking.ova后&#xff0c;用VMware Workstation Pro打开依次点击文件-打开&#xff0c;选择我们刚才下载的ova文件打开&#xff0c;修改…

JavaWeb开发 2.Web开发 Web前端开发 ①介绍

内心一旦平静&#xff0c;外界便鸦雀无声 —— 24.5.27 一、初识Web前端 网页有哪些部分组成? 文字、图片、音频、视频、超链接 ...网页&#xff0c;背后的本质是什么? 前端代码前端的代码是如何转换成用户眼中的网页的? 通过浏览器转化(解析和渲染)成用户看…

表空间[MAIN]处于脱机状态

达梦数据库还原后&#xff0c;访问数据库报错&#xff1a;表空间[MAIN]处于脱机状态 解决方法&#xff1a; 1&#xff1a;检查备份文件 DMRMAN 中使用 CHECK 命令对备份集进行校验&#xff0c;校验备份集是否存在及合法。 ##语法&#xff1a;CHECK BACKUPSET <备份集目录…

小识MFC,一套设计优雅与不优雅并存的类库----小话MFC(2)

Q1&#xff1a; CPoint继承于POINT&#xff0c;这样有什么好处&#xff1f; A&#xff1a; 继承的一个最基本的好处当然就是减少代码量。CPoint和POINT内部数据一样&#xff0c;只是一个提供了更多的方法来操作对象。 typedef struct tagPOINT {LONG x;LONG y; } POINT, *P…

小程序大能量:盲盒平台搭建与营销策略

一、引言 在移动互联网的浪潮下&#xff0c;小程序以其轻量级、即用即走的特点&#xff0c;成为了商家与消费者沟通的新桥梁。盲盒经济作为近年来兴起的消费趋势&#xff0c;结合小程序平台&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家带来了更多的商业机…

【管理咨询宝藏115】某大型电力集团5年战略发展报告终稿

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏115】某大型电力集团5年战略发展报告终稿 【格式】PDF版本 【关键词】战略规划、大型国企、战略报告 【核心观点】 - 战略领导人敏锐的直觉和城…

【乐吾乐3D可视化组态编辑器】模型类型与属性

编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 本章主要为您介绍模型的属性功能。 一个模型至少会包含一个节点&#xff08;Node&#xff09;&#xff0c;从节点类型上可以分为转换节点&#xff08;TransformNode&#xff09;、网格&#xff08;Mesh&#xff09;、实例网…

5.27作业

定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。 #include <iostream> #include <string.h>using namespace std; namespace my_space {string s1;void RevString(string &s1); } v…