【Django 网页Web开发】07. 快捷的表单生成 Form与MoudleForm(保姆级图文)

news2024/10/6 6:48:46

目录

  • 注意 正规写法是 ModelForm,下面文章我多
    • 实现效果
    • url.py
    • 新建3个html文件
    • 数据库连接
    • model.py 数据表
    • 1. 原始方法
      • view.py
      • testOrgion.html
    • 2. Form方法
      • view.py
      • testForm.html
    • 3. MoudleForm方法
      • 给字段设置样式
      • 面向对象的思路,批量添加样式
      • 错误信息的显示
      • 如何写验证规则
      • 设置错误信息语言
      • view.py
      • testMoudleForm.html
    • 总结


欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中

注意 正规写法是 ModelForm,下面文章我多

实现效果

快捷的表单生成,避免繁琐的写法。


url.py

from django.urls import path

from app01 import views

urlpatterns = [

    path('testOrgion/', views.testOrgion),#原始方法
    path('testForm/', views.testForm),#form方法
    path('testMoudleForm/', views.testMoudleForm),#moudleForm方法

]


新建3个html文件

在这里插入图片描述

数据库连接

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 驱动
        'NAME': 'day16',  # 数据库名字
        'USER': 'root',  # mysql用户名
        'PASSWORD': '123456',  # mysql密码
        'HOST': '127.0.0.1',  # 本机安装了MySQL
        'PORT': 3306,  # 端口
    }
}

model.py 数据表

from django.db import models

class TestForm(models.Model):
    """测试学习form表"""
    username=models.CharField(verbose_name="用户名",max_length=10)
    password=models.CharField(verbose_name="密码",max_length=20)

在这里插入图片描述

1. 原始方法

如果有很多字段要显示,明显是比较麻烦的,而且也存在安全的问题,一般只是初学数据库传值的时候使用,后面都不用。

view.py

def testOrgion(request):
    if request.method == "GET":#第一次访问是get请求,展示表单页面
        return render(request, 'testOrgion.html')
    # 第二次访问是POST请求,表示传递数据
    # 获取用户POST提交过来的数据(title输入为空)
    username = request.POST.get("username")
    password = request.POST.get("password")

    # 保存到数据库
    models.TestForm.objects.create(username=username,password=password)

    # 重定向回部门列表
    return render(request, "testOrgion.html")

testOrgion.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>testOrgion</title>
</head>
<body>

<form method="post">
    {% csrf_token %}
    <div class="form-group">
        <label>用户名</label>
        <input type="text" class="form-control" placeholder="用户名" name="username"/>
    </div>
    <div class="form-group">
        <label>密码</label>
        <input type="password" class="form-control" placeholder="密码" name="password"/>
    </div>
    <button type="submit" class="btn btn-primary">提 交</button>
</form>

</body>
</html>

在这里插入图片描述
在这里插入图片描述

2. Form方法

form能够比较便捷的生成表单,还有以下优点

  • (1)自动生成HTML表单元素
  • (2)检查表单数据的合法性
  • (3)如果验证错误,重新显示表单(数据不会重置)
  • (4)数据类型转换(字符类型的数据转换成相应的python类型)

这里武老师是在markdown上直接敲的代码是有问题的,所以运行直接报错。(很明显就能看出来一会儿用forms一会儿用form的)而且CharField方法名字写错写成了CharFiled(单词拼错了····)而且好像用的是weight.input不然会报错

username = forms.CharField(widget=forms.Input)
AttributeError: module 'django.forms' has no attribute 'Input'

在这里插入图片描述

核心思路是预先在view.py中就预先写好一个类存放表单各个字段需要用到的组件。

view.py

from django.shortcuts import render, redirect

from app01 import models

#1.先导入forms模块
from django import forms
from django.forms import widgets
#2.创建模板的类
class studyForm(forms.Form):
    username = forms.CharField(widget=widgets.Input)
    password = forms.CharField(widget=widgets.Input)

def testForm(request):
    if request.method == "GET":
        form = studyForm()
        return render(request, 'testForm.html', {"form": form})

testForm.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>testForm</title>
</head>
<body>

<h1>1.第一种方法一个个输入字段</h1>
<form method="post">
    {% csrf_token %}
    用户名:{{ form.username }}
    密码: {{ form.password }}
    <!-- <input type="text"  placeholder="姓名" name="username" /> -->
    <!-- <input type="password"  placeholder="姓名" name="password" /> -->
</form>

<h1>2.循环遍历所有</h1>
<form method="post">
    {% csrf_token %}
    {# 使用遍历 #}
    {% for field in form %}
        {{ field.label }}:{{ field }}
    {% endfor %}
</form>

<h1>3.直接打印form</h1>
<form method="post">
    {% csrf_token %}
    {{ form }}
</form>

<h1>4.用form.as_p会换行</h1>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
</form>

</body>
</html>

在这里插入图片描述

3. MoudleForm方法

重点介绍:样式设置,表单验证

给字段设置样式

在widgets中写入属性attrs样式

    #创建子类,选择数据字段,给不同字段设置样式
    class Meta:
        model = models.TestForm  # 选择数据表,model表示读取数据表的指定字段
        # models = models.TestForm #选择数据表,models表示默认读取数据表的所有字段
        fields = ["username", "password"]  # 选择数据表的字段
        widgets = {
            "name": forms.TextInput(attrs={"class": "form-control"}),
            "password": forms.PasswordInput(attrs={"class": "form-control"}),
        }

面向对象的思路,批量添加样式

class StudyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 循环找到所有的插件,添加了class="form-control"
        for name, field in self.fields.items():
            # if name == "password":
            #     continue
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}

错误信息的显示

在html中
错误信息会是一个列表,有很多,但是我们一般性从上到下只提示一个错误信息,比如说用户名不对,密码格式长度也不对,我们只显示列表第0位错误{{ field.errors.0 }},用span标签包起来

                {% for field in form %}
                    <div class="form-group">
                        <label>{{ field.label }}</label>
                        {{ field }}
                        <span style="color: red;">{{ field.errors.0 }}</span>
                    </div>
                {% endfor %}

如何写验证规则

class StudyModelForm(forms.ModelForm):
    # 一般错误检查是非空,如果要有其他检查比如最小长度3,需要像下面这样另外写(回到了form的那种)
    username = forms.CharField(min_length=3, label="用户名")

设置错误信息语言

在这里插入图片描述

LANGUAGE_CODE = 'en-us'#英文
LANGUAGE_CODE = 'zh-hans'#中文

在这里插入图片描述
在这里插入图片描述

view.py

from django.shortcuts import render, redirect

from app01 import models

################################# ModelForm 示例 #################################
from django import forms


# 新建一个StudyModelForm类
class StudyModelForm(forms.ModelForm):
    # 一般错误检查是非空,如果要有其他检查比如最小长度3,需要像下面这样另外写(回到了form的那种)
    username = forms.CharField(min_length=3, label="用户名")

    # 创建子类,选择数据字段,给不同字段设置样式
    class Meta:
        model = models.TestForm  # 选择数据表,model表示读取数据表的指定字段
        # models = models.TestForm #选择数据表,models表示默认读取数据表的所有字段
        fields = ["username", "password"]  # 选择数据表的字段
        # widgets = {
        #     "username": forms.TextInput(attrs={"class": "form-control"}),
        #     "password": forms.PasswordInput(attrs={"class": "form-control"}),
        # }

    # 当做一种固定写法,解释起来比较复杂
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 循环找到所有的插件,添加了class="form-control"
        for name, field in self.fields.items():
            # if name == "password":
            #     continue
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}


def testMoudleForm(request):
    """ 添加用户(ModelForm版本)"""
    if request.method == "GET":
        form = StudyModelForm()
        return render(request, 'testMoudleForm.html', {"form": form})

    # 用户POST提交数据,数据校验。
    form = StudyModelForm(data=request.POST)
    if form.is_valid():
        # {'username': 'ghj', 'password': 'asd'}
        print(form.cleaned_data) #打印我们通过校验的数据

        # models.TestForm.objects.create(username=username, password=password)#可以用form.save()替代
        form.save()  # 如果数据合法,把校验通过的数据保存到数据库
        return redirect('/testMoudleForm/')

    # 校验失败(在页面上显示错误信息)
    return render(request, 'testMoudleForm.html', {"form": form})

testMoudleForm.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>testMoudleForm</title>
</head>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">

<body>
<div class="container">
    <div class="panel panel-default">
        <div class="panel-heading">
            <h3 class="panel-title"> 新建用户 </h3>
        </div>
        <div class="panel-body">
            <form method="post" novalidate>
                {% csrf_token %}

                {% for field in form %}
                    <div class="form-group">
                        <label>{{ field.label }}</label>
                        {{ field }}
                        <span style="color: red;">{{ field.errors.0 }}</span>
                    </div>
                {% endfor %}

                <button type="submit" class="btn btn-primary">提 交</button>
            </form>
        </div>
    </div>
</div>
{#导入jquery和bootstrap,注意要先导入js再导入jquery,顺序的问题#}
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>


在这里插入图片描述
在这里插入图片描述


总结

大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的Python 网页Web开发知识!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中
【更多内容敬请期待】


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

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

相关文章

ASIC-WORLD Verilog(10)编写测试脚本Testbench的艺术

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…

干货!来自北大、KAUST、斯坦福、达摩院的大模型前沿动态:表格推理、代码生成、MiniGPT-4、生成式推理...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; ChatGPT的发布使得国内外众多的研究机构掀起了一股AI热潮&#xff0c;而这也进一步推动了人们对大语言模型的深入研究。2023年4月26日&#xff0c;AI TIME举办的大模型专场四活动邀请了阿里巴巴达摩院NLP研究员…

在 IDEA 中配置 JavaFX 11

因为从 Java8/openjdk 之后&#xff0c;javafx 从 jdk 中移除&#xff0c;如果进行 JavaFX 开发需要在 module 中添加 lib&#xff0c;并对 IDE 进行配置&#xff0c;确保 jdk 可以与 javafx 正常调用。 javafx 下载路径&#xff0c;主页网址&#xff1a;https://openjfx.io/ …

开发实践|程序员是如何刷抖音、玩快手、看头条进行赚米的?

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1a;[ https://www.weiyigeek.top ] 博客&…

【计算机组成原理与体系结构】数据的表示与运算

目录 一、进位计数制 二、信息编码 三、定点数数据表示 四、校验码 五、定点数补码加减运算 六、标志位的生成 七、定点数的移位运算 八、定点数的乘除运算 九、浮点数的表示 十、浮点数的运算 一、进位计数制 整数部分&#xff1a; 二进制、八进制、十六进制 --…

穿越认知峡谷

十年前&#xff0c;2013 年的这个时候&#xff0c;“互联网思维”在国内大火。我没有认真研究过这件事的来龙去脉&#xff0c;不过印象里 2012 年底《罗辑思维》视频栏目的开播&#xff0c;以及差不多同时小米手机的爆发&#xff0c;对“互联网思维”的大流行应该是起了重要的推…

【ABAP】数据类型(一)「数据类型概要及分类」

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…

Nginx正则表达式、location、rewrite

目录 一、常用的Nginx正则表达式 二&#xff1a;localtion 1、location 分类 2、 location 常用的匹配规则 3、location 优先级 4、 location 示例 5、优先级总结 6、实际网站使用中&#xff0c;至少有三个匹配规则定义 &#xff08;1&#xff09;第一个必选规则 &…

深入理解设计原则之接口隔离原则(ISP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 LSP&#xff1a;接口隔离原则 系列文章目录1、接口隔离原则的定义和解读2、案例解读3、如何判断一个接口是否符合接口隔离原则&#xff1f;小结 1、接口隔离原则的定义和…

CVPR 2023 医学图像分割论文大盘点

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【医学图像分割】微信交流群 被催了很久&#xff0c;CVer 正式开启 CVPR 2023 论文大盘点系列&#xff01;Amusi 一共搜集了13篇医学图像分割论文&#xff0c;这应该是目前各…

HTML 5中的文件处理之FileAPI

在众多HTML5规范中&#xff0c;有一部分规范是跟文件处理有关的&#xff0c;在早期的浏览器技术中&#xff0c;处理小量字符串是js最擅 长的处理之一。但文件处理&#xff0c;尤其是二进制文件处理&#xff0c;一直是个空白。在一些情况下&#xff0c;我们不得不通过Flash/Acti…

GPT国内的一些产品真的比国外的差吗?(篇幅较长,请收藏)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 本次讨论的话题仅限于计算机视觉研究院个人观点&#xff0c;若有说的不对的地方勿喷&#xff0c;有…

k8s之docker-扩展知识(八)

一.Docker的应用场景 Web 应用的自动化打包和发布。 自动化测试和持续集成、发布。 在服务型环境中部署和调整数据库或其他的后台应用。 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 二.Docker 的优点 Docker 是一个用于开发&#…

【ChatGPT】Mr. Ranedeer:可定制个性化学习体验的 GPT-4 AI 导师提示

Mr. Ranedeer AI Tutor是一个可定制的提示&#xff0c;为具有不同需求和兴趣的用户提供个性化的学习体验。它使用GPT-4来释放AI的潜力&#xff0c;并允许您调整知识深度以匹配您的学习需求&#xff0c;自定义学习风格&#xff0c;沟通类型&#xff0c;语气和推理框架 。 当您使…

ISO21434 组织网络安全管理(二)

目录 一、概述 二、目标 三、输入 3.1 先决条件 3.2 进一步支持信息 四、要求和建议 4.1 网络安全治理 4.2 网络安全文化 4.3 信息共享 4.4 管理系统 4.5 工具管理 4.6 信息安全管理 4.7 组织网络安全审计 五、输出 一、概述 为了实现网络安全工程&#xff0c;该…

自动驾驶TPM技术杂谈 ———— 车辆分类

文章目录 机动车规格机动车结构机动车使用性质机动车和挂车分类接近角定义离去角定义纵向通过角定义离地间隙定义前后轴之间的离地间隙轴下离地间隙 机动车规格 机动车规格分类 分类 说明 汽车 载客汽车 大型 车长大于或等于 6000mm 或者乘坐人数大于或等于20 人的载客汽车。 …

【微信小程序开发】第 4 节 - 创建小程序项目

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、点击 “加号” 按钮 3、项目创建完成 4、在模拟器上查看项目效果 5、在真机上预览项目效果 6、主页面的 5 个组…

安卓调试|一文归纳总结adb调试工具常规命令

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1a;[ https://www.weiyigeek.top ] 博客&…

FPGA PAL视频BT656解码Video Processing Subsystem去隔行工程源码 TW2867采集4路视频拼接输出 提供技术支持

目录 1、前言2、我这里已有的PAL视频解码方案3、模拟视频概述4、模拟视频颜色空间5、逐行与隔行6、BT656数据与解码BT656数据格式BT656数据解码 7、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析 8、设计思路与框架9、vivado工程详解Block Design设计SDK设计…

chatgpt赋能python:Python奇偶数求和方法详解

Python奇偶数求和方法详解 在日常的编程开发中&#xff0c;经常需要对数字进行分类求和&#xff0c;其中“奇偶数求和”更是最常见的问题之一。而Python作为一种高效、可靠的编程语言&#xff0c;其在求解奇偶数的优秀性能备受瞩目。接下来本篇文章将详细介绍Python奇偶数求和…