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

目录

  • 注意 正规写法是 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开发』 系列,持续更新中
【更多内容敬请期待】


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搜索算法(三) 回溯法

1.回溯法 回溯法可以理解成一种特殊的深度优先算法&#xff0c;比起普通的DFS&#xff0c;多了还原当前节点的一步。 修改当前节点、递归子节点、还原当前节点。 本质是一种试错的思想。 维基百科&#xff1a; 2.例题 1&#xff09; 力扣https://leetcode.cn/problems/pe…

17_Linux根文件简介与Busybox构建文件系统

目录 根文件系统简介 文件目录简介 BusyBox简介 编译BusyBox构建根文件系统 修改Makefile添加编译器 busybox中文字符支持 配置 busybox 编译busybox 向根文件系统添加lib库 向rootfs的“usr/lib”目录添加库文件 创建其他文件夹 根文件系统初步测试 根文件系统简介…

行业应用|立仪光谱共焦位移传感器在玻璃方面的检测

项目&#xff1a;玻璃管管壁单边测厚 行业应用|立仪光谱共焦位移传感器在玻璃方面的检测 行业应用|立仪光谱共焦位移传感器在玻璃方面的检测 检测方案 用D35A7镜头对玻璃管管壁进行单边测厚&#xff0c;取三个点静态测量厚度并记录重复性。 1、采用D35A7R2S35镜头对玻璃管管…

Android Input子系统 - kernel

目录 前言 数据结构 输入子系统流程 前言 上一节有展示Android Input子系统的架构图,这里我们关心Linux kernel层 可以看到kernel层分为三层: 输入子系统设备驱动:处理与硬件相关的信息,调用input API注册输入设备,并把数据往上报 输入子系统核心层:为事件处理层和设…

Python之并发多线程操作

一、threading模块介绍 multiprocess模块的完全模仿了threading模块的接口&#xff0c;二者在使用层面&#xff0c;有很大的相似性 二、开启线程的两种方式 方式一 #方式一 from threading import Thread import time def sayhi(name):time.sleep(2)print(%s say hello %na…

迷你版ChatGPT开源,教你怎么用nanoGPT训练一个写小说的AI机器人!

大家好,我是千与千寻,好久不见,最近太忙了,去医院拔了颗智齿,这不是刚休息一天,就立刻来给大家分享ChatGPT的新奇项目了。 ChatGPT的功能确实是好用,但是我觉得有一个小缺点,就是反应的时间比较慢,原因是GPT-3.5/GPT-4.0的模型体积较大,比较占用内存空间。 同时大模…

10.ES6模块化规范(关键字 import,from,as,export的用法)

导入其他模块成员要使用关键字 import &#xff0c;导出需要使用关键字 export 我们明确一个概念&#xff0c;只有js与js之间需要使用import与export&#xff0c;如果是在html中引入js是不需要用import的&#xff0c;你导入的方式是直接srcxxx.js 目录 1 默认导入导出 2 …

【高危】Apache Inlong 存在JDBC反序列化漏洞

漏洞描述 Apache InLong 是可用于构建基于流式的数据分析、建模等一站式的海量数据集成框架。 在Apache Inlong受影响版本&#xff0c;由于未对接收的jdbcUrl参数过滤空格字符&#xff0c;导致可以利用空格绕过jdbcUrl中autoDeserialize参数过滤限制&#xff0c;通过认证的攻…

尚硅谷JUC极速版笔记

尚硅谷JUC极速版笔记 1、JUC概述1.1 进程和线程1.2 线程的状态&#xff08;6个&#xff09;1.3 wait和sleep1.4 并发与并行1.5 管程&#xff08;锁&#xff09;1.6 用户线程和守护线程 2、Lock接口2.1 复习synchronized&#xff08;java内置同步锁&#xff09;2.2 什么是Lock接…

设计模式详解之策略模式

作者&#xff1a;刘文慧 策略模式是一种应用广泛的行为型模式&#xff0c;核心思想是对算法进行封装&#xff0c;委派给不同对象来管理&#xff0c;本文将着眼于策略模式进行分享。 一、概述 我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&#x…

LayUI前框框架普及版

LayUI 一、课程目标 1. 【了解】LayUI框架 2. 【理解】LayUI基础使用 3. 【掌握】LayUI页面元素 4. 【掌握】LayUI内置模块二、LayUI基本使用 2.1 概念 layui&#xff08;谐音&#xff1a;类UI) 是一款采用自身模块规范编写的前端 UI 框架&#xff0…

阿里云nginx配置https踩坑(配置完后访问显示无法访问此网站)

本人小前端一枚&#xff0c;最近在玩服务器部署自己的东西时踩了个坑&#xff01;&#xff01;&#xff01; server {listen 443 ssl;server_name localhost;ssl_certificate 证书.com.pem;ssl_certificate_key 证书.com.key;#后台管理静态资源存放location / { #文件目…

springboot+vue新闻稿件java在线投稿管理系统

本文介绍了新闻稿件管理系统的开发全过程。通过分析新闻稿件管理系统管理的不足&#xff0c;创建了一个计算机管理新闻稿件管理系统的方案。文章介绍了新闻稿件管理系统的系统分析部分&#xff0c;包括可行性分析等&#xff0c;系统设计部分主要介绍了系统功能设计和数据库设计…

微信小程序开发实战 ②②(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

基于flask的web应用开发——访问漂亮的html页面以及页面跳转

目录 0. 前言1. html基本知识2. 编写html文本3. 在Flask中设置访问html4. 实现点击跳转 0. 前言 本节学习如何在flask应用程序下让用户访问你提前制作好的html页面 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Python解释器版本&am…

Arcgis进阶篇(6)——如何将Arcgis Pro的离线数据发布成服务

常常因为Arcgis Server&#xff08;或者GeoScene Server&#xff09;昂贵的价格&#xff0c;而导致小项目技术选型选择开源的GIS Server&#xff08;如GeoServer等&#xff09;。但用完之后&#xff0c;发现后者实在拉跨&#xff0c;使用对比差异巨大。那就只能另想办法&#x…

基于轻量级YOLOv5n/s/m三款模型开发构建基于无人机视角的高空红外目标检测识别分析系统,对比测试分析性能

有关于无人机目标检测和红外场景下的目标检测的项目在我之前的文章中都有实践经历了&#xff0c;但是将无人机和红外场景结合的目标检测项目还是很少的&#xff0c;本文的核心想法就是基于高空无人机场景开发构建目标检测系统。 前面相关博文如下&#xff0c;感兴趣的话可以自…

Ubuntu本地快速搭建web小游戏网站,公网用户远程访问【内网穿透】

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;在Ubunt…

BGP状态机

BGP协议基本概念 BGP是一种外部网管协议(EGP),与OSPF、RIP等内部网管协议(IGP)不同,其着眼点不在于自动发现网络拓扑,而在于AS之间选择最佳路由和控制路由的传播。 自治系统AS( Autonomous System) 由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。 …

CDN如何进行内容缓存与内容预热

CDN的启用与管理 1、打开火伞云融合CDN系统控制后台-CDN管理 2、查看加速域名下的全部CDN服务&#xff0c;可以看到有部分厂商暂时处于未启用状态&#xff0c;这是因为这些厂商要求进行域名所有权校验后方可使用&#xff08;如果已经处于已启用状态的厂商则不用额外进行操作&…