Django之Form组件

Django之Form组件

目录

  • Django之Form组件
    • 介绍
    • 手动渲染错误信息
    • 基于Form组件校验数据
    • 重写错误信息
      • 用户名与密码
      • radioSelect
      • 单选Select
      • 多选Select
      • 单选checkbox
      • 多选checkbox
    • 前端渲染

介绍

Form组件提供了一种在网页上收集用户输入数据并将其提交到服务器进行处理的机制,这样可以极大的减少书写报错信息时的工作量

手动渲染错误信息

def register(request):
    error_msg_dict = {}
    if request.method == "POST":
        data = request.POST
        username = data.get("username")
        password = data.get("password")
        if username != "aaa":
            error = "用户名错误"
            error_msg_dict["username_error"] = error
        if password != "111":
            error = "密码错误"
            error_msg_dict["password_error"] = error
    return render(request, "register.html", locals())
<form action="" method="post">
    <p>
        username : <input type="text" name="username">
        <span style="color: red">{{ error_msg_dict.username_error }}</span>
    </p>
    <p>
        password : <input type="password" name="password">
        <span style="color: red">{{ error_msg_dict.password_error }}</span>
    </p>
        <input type="submit">
    </p>
</form>

基于Form组件校验数据

在app中创建UserForm.py文件

image-20240311212053636

语法和模型层类似,max_length指定了最大数据长度

from django import forms

class UserForm(forms.Form):
    user = forms.CharField(max_length=20,min_length=6)
    pwd = forms.CharField(max_length=20,min_length=6)

调用Form组件

def register(request):

    if request.method == 'POST' and request.is_ajax():
        # data = request.POST
        data = json.loads(request.body.decode())
        username = data.get('username')
        password = data.get('password')
        print(username, password)
        # 创建Form对象,键是类中定义的参数,值是前端传来的数据
        form_obj = UserForm({
            'user': username,
            'pwd':password,
        })
        # 校验数据是否合法
        print(form_obj.is_valid())
        print(f'所有字段{form_obj.changed_data}')
        print(f'合法的obj:{form_obj.changed_data}')
        print(f'非法的obj:{form_obj.errors}')
        state = {'state': 200}
        return JsonResponse(state)
    return render(request, 'app01/register.html')

打印结果

False

所有字段['user', 'pwd']

合法的obj['user', 'pwd']

非法的obj<ul class="errorlist"><li>user<ul class="errorlist"><li>确保该变量至少包含 6 字符(目前字符数 3)</li></ul></li><li>pwd<ul class="errorlist"><li>确保该变量至少包含 6 字符(目前字符数 3)</li></ul></li></ul>

此结果表示user和pwd数据都未达到最低限制长度

重写错误信息

用户名与密码

from django import forms


class UserForm(forms.Form):
    user = forms.CharField(max_length=20, min_length=6,
                           error_messages={
                               "required": "不能为空",
                               "invalid": "格式错误",
                               "max_length": "用户名最长20位",
                               "min_length": "用户名最短8位"
                           }
                           )
    pwd = forms.CharField(max_length=20, min_length=6,
                          error_messages={
                              "required": "不能为空",
                              "invalid": "格式错误",
                              "max_length": "密码最长20位",
                              "min_length": "密码最短8位"
                          }
                          )

radioSelect

单radio值为字符串

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6, label="密码")
    gender = forms.fields.ChoiceField(
        choices=((1, "男"), (2, "女"), (3, "保密")),
        label="性别",
        initial=3,
        widget=forms.widgets.RadioSelect()
    )

单选Select

class LoginForm(forms.Form):
    ...
    hobby = forms.ChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=3,
        widget=forms.widgets.Select()
    )

多选Select

class LoginForm(forms.Form):
    ...
    hobby = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
    )

单选checkbox

class LoginForm(forms.Form):
    ...
    keep = forms.ChoiceField(
        label="是否记住密码",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
    )

多选checkbox

class LoginForm(forms.Form):
    ...
    hobby = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
    )

前端渲染

forms类

from django import forms

# 按照Django form组件的要求自己写一个类
class UserForm(forms.Form):
    name = forms.CharField(label="用户名")
    pwd = forms.CharField(label="密码")

views.py

def register(request):
    form_obj = MyForm
    if request.method == "POST":
        # 实例化form对象的时候,把post提交过来的数据直接传进去
        form_obj = RegForm(request.POST)
        # 校验成功后执行
        if form_obj.is_valid():
            return HttpResponse("注册成功")
    return render(request, "register.html", locals())

前端

<body>
    <form action="" method="post" novalidate autocomplete="off">
        <div>
            <label for="{{ form_obj.username.id_for_label }}">{{ form_obj.username.label }}</label>
            {{ form_obj.username }} {{ form_obj.username.errors.0 }}
        </div>
        <div>
            <label for="{{ form_obj.password.id_for_label }}">{{ form_obj.password.label }}</label>
            {{ form_obj.password }} {{ form_obj.password.errors.0 }}
        </div>
        <div>
            <input type="submit" class="btn btn-success" value="注册">
        </div>
    </form>
</body>

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

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

相关文章

实战纪实 | 记一次绕过宝塔的的文件上传

前几天找到个可以上传任意文件的上传点&#xff0c;成功上传phpinfo页面并能访问&#xff0c;但是不能成功上传一句话&#xff0c;发现这台主机装了宝塔&#xff0c;经过反复尝试终于成功上传一句话并连接。 0x01 漏洞发现 结果前期摸索&#xff0c;发现了一个上传点&#xff0…

Java中 常见的开源树库介绍

阅读本文之前请参阅------Java中 树的基础知识介绍 在 Java 中&#xff0c;有几种流行的开源树库&#xff0c;它们提供了丰富的树算法和高级操作&#xff0c;可以帮助开发者更高效地处理树相关的问题。以下是几种常见的 Java 树库及其特点和区别&#xff1a; JTree 特点…

一场“猜成绩”大赛:ArrayList vs. LinkedList

今天我们将带来一场精彩绝伦的较量——ArrayList对阵LinkedList。 ArrayList它就像是一张大桌子&#xff0c;可以容纳各种各样的物品。 ArrayList是一个动态数组&#xff0c;具有随机访问的能力&#xff0c;这意味着我们可以在O(1)的时间复杂度内访问任意位置的元素。 它还具…

从零开始的LLaMA-Factory的指令增量微调

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

TinTin Web3 动态精选:以太坊坎昆升级利好 Layer2,比特币减半进入倒计时

TinTin 快讯由 TinTinLand 开发者技术社区打造&#xff0c;旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位&#xff0c; 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态&#xff0c;将有助于 TinTinLand 社区的开…

促合作 | 遵义医科大学珠海校区老师一行莅临全视通参观交流

近日&#xff0c;遵义医科大学珠海校区&#xff08;简称“遵医”&#xff09;护理学系副主任李佳、大学生创新创业中心主任王燕&#xff0c;携同校内多位教师&#xff0c;共赴珠海全视通信息技术有限公司&#xff08;简称“全视通”&#xff09;进行参观交流。此次来访旨在深化…

【刷题训练】LeetCode125. 验证回文串

验证回文串 题目要求 示例 1&#xff1a; 输入: s “A man, a plan, a canal: Panama” 输出&#xff1a;true 解释&#xff1a;“amanaplanacanalpanama” 是回文串。 示例 2&#xff1a; 输入&#xff1a;s “race a car” 输出&#xff1a;false 解释&#xff1a;“rac…

mysql数据库:使用 bash脚本 + 定时任务 自动备份数据

mysql数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏…

Flutter学习笔记---flutter环境搭建以及dart语法的学习

Flutter笔记 Flutter环境搭建 获取 Dart SDK | Dart dart-pub | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror Flutter、Dart SDK镜像资源 - 掘金 (juejin.cn) Index of /flutter/dart-archive/channels/stable/release/3.2.6/sdk/ | 清华大学…

在webapp中手动发布一个应用

目录 第一步找到wedapps文件 第二步在wedapps文件自定义创建一个文件夹 第三步在自定义的文件夹里写一个HTMl文件 第四步进bin文件找到startup打开服务器​编辑 第五步打开浏览器输入网址http://localhost:8080//demoApp//index.htmlhttp://localhost:8080//文件和后缀名 第…

微信每天通过好友上限是多少个呢?

微信每天通过好友上限是多少个呢&#xff1f; 1、新号和不活跃的号 微信新号是指注册不满15十五天&#xff0c;或者注册超过15天&#xff0c;但是没有好好养号的的账号。&#xff08;包括很多长期不活跃的账号&#xff0c;突然使用的情况&#xff09; 2、正常帐号 &#xf…

ABAP-SE16N查询底表使用自己的布局

ABAP-SE16N查询底表使用自己的布局 调整好列的位置和顺序之后&#xff0c;可以保存自己的布局&#xff0c;点击“布局”按钮&#xff0c;点击“保存布局”&#xff1a; 特定于用户&#xff1a;是只对自己有效 缺省&#xff1a;会影响所有用户 在代码里面是这样的&#xff1a;…

Android和IOS应用开发-Flutter 应用中实现记录和使用全局状态的几种方法

文章目录 在Flutter中记录和使用全局状态使用 Provider步骤1步骤2步骤3 使用 BLoC步骤1步骤2步骤3 使用 GetX&#xff1a;步骤1步骤2步骤3 在Flutter中记录和使用全局状态 在 Flutter 应用中&#xff0c;您可以使用以下几种方法来实现记录和使用全局状态&#xff0c;并在整个应…

java中的String

&#xff08;1&#xff09;创建字符串对象 //方式1 String str "abc"; //方式2 String str new String("abc"); 方式1表示&#xff1a;在字符串常量池&#xff08;String Pool&#xff09;中先寻找值为 “abc” 的内存地址&#xff0c;如果找不到&…

AI程序员Devin会在6个方面影响人类程序员

讲动人的故事&#xff0c;写懂人的代码 初创公司Cognition最近所发布的世界上首个AI程序员Devin&#xff0c;让人类程序员百感交集。因为Devin能自动干下面的事情&#xff1a; 自己学习不熟悉的技术&#xff1b; 端到端地自己搭建和部署应用程序&#xff1b; 自己找出并修复…

【数据结构】单向链表的创建及4种应用

目录 前言 自定义“单向”链表类 1. 自定义一个链表类&#xff0c;并完成“初始化链表”、“添加元素&#xff08;头插法/尾插法&#xff09;”、“计算链表长度”操作&#xff1b; 自定义链表 向链表中插入元素&#xff08;头插法&#xff09; 向链表中插入元素&#xf…

D-阿洛酮糖-DAEase酶固定化载体及混合糖液分离

#D-阿洛酮糖-DAEase酶固定化载体及混合糖液分离 ​阿洛酮糖为白色固体晶体&#xff0c;无气味&#xff0c;具有较大的溶解度&#xff0c;柔和的口感&#xff0c;其具有传统甜味剂蔗糖70%的甜度&#xff0c;却几乎不提供任何热量。其与食物中的蛋白质&#xff0c;如鸡蛋蛋白发生…

使用SpaceDesk实现iPad成为电脑拓展屏(保姆级教程)

使用SpaceDesk实现iPad成为电脑拓展屏 SpaceDesk是一个开源的软件, 所以说对学生和平民用户非常的友好, 连接后的画质也非常不错, 而且具有无线和有线两种连接方式. 接下来就开始教程: 1. 安装SpaceDesk电脑版 首先我们要下载SpaceDesk电脑版安装好: SpaceDesk官网 注意: …

Unity PS5开发 天坑篇 之 DEVKit环境部署与系统升级02

上一篇各位大神们已经收到了SONY官方免费寄送的PS5开发机与测试机&#xff0c;恭喜大家成为SONY的开发者, 本篇继续PS5开发机的部署与开发套件使用。 一, PC安装PS5 SDK与系统升级 1. PC/PS5 SDK Manager下载安装包 登录开发者账号后&#xff0c;Development->Resources&a…

深入浅出:Python中的JSON操作和最佳实践

深入浅出&#xff1a;Python中的JSON操作和最佳实践 引言Python中处理JSON的基础读取JSON数据示例&#xff1a; 将Python对象转换为JSON格式示例&#xff1a; 进阶使用技巧高级参数的使用示例&#xff1a; 处理复杂对象&#xff1a;自定义编码器示例&#xff1a; 解析复杂JSON数…