forms组件

1. 校验字段功能

针对一个实例:注册用户讲解。

模型:models.py

  1. class UserInfo(models.Model):
  2. name=models.CharField(max_length=32)
  3. pwd=models.CharField(max_length=32)
  4. email=models.EmailField()
  5. tel=models.CharField(max_length=32)

视图函数:register

  1. from django.forms import widgets
  2. from django.core.exceptions import ValidationError
  3.  
  4. wid_01 = widgets.TextInput(attrs={"class": "form-control"}) #用了bootstrap,所以加个样式属性
  5. wid_02 = widgets.PasswordInput(attrs={"class": "form-control"}) #注意!! 在校验失败后,form对象不保存PasswordInput的value值,所以页面要重新输入
  6.  
  7. class UserForm(forms.Form):
  8. name = forms.CharField(min_length=3, label="用户名", error_messages={"required": "该字段不能为空", "min_length": "最小长度为3"},
  9. widget=wid_01
  10. )
  11. pwd = forms.CharField(min_length=4, label="密码",
  12. widget=wid_02
  13. )
  14. r_pwd = forms.CharField(min_length=4, label="确认密码", error_messages={"required": "该字段不能为空"},
  15. widget=wid_02)
  16. email = forms.EmailField(label="邮箱", error_messages={"required": "该字段不能为空", "invalid": "格式错误"},
  17. widget=wid_01)
  18. tel = forms.CharField(label="手机号", widget=wid_01)
  19.  
  20. def register(request):
  21. if request.method == "POST":
  22.  
  23. print(request.POST)
  24.  
  25. # form=UserForm({"name":"yu","email":"123@qq.com","xxxx":"alex"})
  26.  
  27. form = UserForm(request.POST) # form表单的name属性值应该与forms组件字段名称一致
  28.  
  29. print(form.is_valid()) # 返回布尔值
  30.  
  31. if form.is_valid():
  32. print(form.cleaned_data) # {"name":"yuan","email":"123@qq.com"}
  33. else:
  34. print(form.cleaned_data) # {"email":"123@qq.com"}
  35. # print(form.errors) # {"name":[".........."]}
  36. # print(type(form.errors)) # ErrorDict : {"校验错误的字段":["错误信息",]}
  37. # print(form.errors.get("name"))
  38. # print(type(form.errors.get("name"))) # ErrorList ["错误信息",]
  39. # print(form.errors.get("name")[0])
  40.  
  41. return render(request, "register.html", locals())
  42.  
  43. '''
  44.  
  45. form.is_valid() :返回布尔值
  46. form.cleaned_data :{"name":"yuan","email":"123@qq.com"}
  47. form.errors :{"name":[".........."]}
  48.  
  49. '''
  50.  
  51. form = UserForm()
  52.  
  53. return render(request, "register.html", locals())

2. 渲染标签功能

2.1 渲染方式1

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  7. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  8. </head>
  9. <body>
  10. <h3>注册页面</h3>
  11. <div class="container">
  12. <div class="row">
  13. <div class="col-md-6 col-lg-offset-3">
  14.  
  15. <form action="" method="post">
  16. {% csrf_token %}
  17. <div>
  18. <label for="">用户名</label>
  19. {{ form.name }}
  20. </div>
  21. <div>
  22. <label for="">密码</label>
  23. {{ form.pwd }}
  24. </div>
  25. <div>
  26. <label for="">确认密码</label>
  27. {{ form.r_pwd }}
  28. </div>
  29. <div>
  30. <label for=""> 邮箱</label>
  31. {{ form.email }}
  32. </div>
  33.  
  34. <input type="submit" class="btn btn-default pull-right">
  35. </form>
  36. </div>
  37. </div>
  38. </div>
  39.  
  40. </body>
  41. </html>

2.2 渲染方式2

  1. <form action="" method="post">
  2. {% csrf_token %}
  3.  
  4. {% for field in form %}
  5. <div>
  6. <label for="">{{ field.label }}</label>
  7. {{ field }}
  8. </div>
  9. {% endfor %}
  10. <input type="submit" class="btn btn-default pull-right">
  11.  
  12. </form>

2.3 渲染方式3

  1. <form action="" method="post">
  2. {% csrf_token %}
  3.  
  4. {{ form.as_p }}
  5. <input type="submit" class="btn btn-default pull-right">
  6.  
  7. </form>

3. 显示错误与重置输入信息功能

视图

  1. def register(request):
  2.  
  3. if request.method=="POST":
  4. form=UserForm(request.POST)
  5. if form.is_valid():
  6. print(form.cleaned_data) # 所有干净的字段以及对应的值
  7. else:
  8. print(form.cleaned_data) #
  9. print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
  10. print(form.errors.get("name")) # ErrorList ["错误信息",]
  11. return render(request,"register.html",locals())
  12. form=UserForm()
  13. return render(request,"register.html",locals())

模板

  1. <form action="" method="post" novalidate>
  2. {% csrf_token %}
  3.  
  4. {% for field in form %}
  5. <div>
  6. <label for="">{{ field.label }}</label>
  7. {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
  8. </div>
  9. {% endfor %}
  10. <input type="submit" class="btn btn-default">
  11.  
  12. </form>

4. 局部钩子与全局钩子

视图


  1. # forms组件
  2. from django import forms
  3. from django.core.exceptions import ValidationError
  4. class UserForm(forms.Form):
  5. username = forms.CharField(min_length=3, max_length=6, label="用户名",
  6. error_messages={"required": "该字段不能为空", "min_length": "最小长度为3", "max_length": "最大长度为6"}, )
  7. password = forms.CharField(max_length=32, label="密码", error_messages={"required": "该字段不能为空"})
  8. r_pwd = forms.CharField(max_length=32, label="确认密码", error_messages={"required": "该字段不能为空"})
  9. email = forms.EmailField(label="邮箱", error_messages={"required": "该字段不能为空", "invalid": "格式错误"})
  10. phone = forms.CharField(max_length=32, label="手机号")
  11. def __init__(self, *args, **kwargs): # 给每个标签添加属性
  12. super().__init__(*args, **kwargs)
  13. for field in self.fields.values():
  14. field.widget.attrs['class'] = 'form-control'
  15. # 局部钩子
  16. def clean_username(self):
  17. val = self.cleaned_data.get("username")
  18. if not val.isdigit():
  19. return val
  20. else:
  21. raise ValidationError("用户名不能是纯数字!")
  22. # 全局钩子
  23. def clean(self):
  24. pwd = self.cleaned_data.get("password")
  25. r_pwd = self.cleaned_data.get("r_pwd")
  26. if pwd == r_pwd:
  27. return self.cleaned_data
  28. else:
  29. raise ValidationError('两次密码不一致!')
  30. def register(request):
  31. form = UserForm()
  32. if request.method == "POST":
  33. form = UserForm(request.POST)
  34. if form.is_valid():
  35. print(form.cleaned_data)
  36. user = UserInfo.objects.create_user(username=request.POST.get("username"),
  37. password=request.POST.get("password"), phone=request.POST.get("phone"),
  38. email=request.POST.get("email"))
  39. return redirect("/blog/login/")
  40. else:
  41. errors = form.errors.get("__all__")
  42. return render(request, "register.html", locals())
  43. return render(request, "register.html", locals())

模板

  1. <form action="" method="post">
  2. {% csrf_token %}
  3. <p>{{ form.username.label }}
  4. {{ form.username }} <span class="pull-right error">{{ form.username.errors.0 }}</span>
  5. </p>
  6. <p>{{ form.password.label }}
  7. {{ form.password }} <span class="pull-right error">{{ form.password.errors.0 }}</span>
  8. </p>
  9. <p>{{ form.r_pwd.label }}
  10. {{ form.r_pwd }} <span class="pull-right error">{{ form.r_pwd.errors.0 }}</span>
  11. <span class="pull-right error">{{ errors.0 }}</span>
  12. </p>
  13. <p>{{ form.email.label }}
  14. {{ form.email }}<span class="pull-right error">{{ form.email.errors.0 }}</span></p>
  15. <p>{{ form.phone.label }}
  16. {{ form.phone }} <span class="pull-right error">{{ form.phone.errors.0 }}</span></p>
  17. <button type="submit" class="btn btn-success">提交注册</button>
  18. </form>

Django 之 Form的更多相关文章

  1. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  2. Django models Form model_form 关系及区别

    Django models Form model_form

  3. 【Django】--Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 例子: 1.创建Form类 from djan ...

  4. Django基础——Form&Ajax篇

    一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...

  5. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  6. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

  7. 69、django之Form组件

    本篇导航: 小试牛刀 Form类 常用选择插件 自定义验证规则 初始化数据 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次 ...

  8. Django的Form(二)

    上一篇已经简单介绍了Django的Form,现在开始进阶操作了 ..... 创建Form类的时候,主要涉及到Form字段和Form的插件,字段用于做form验证,插件用来生成HTML DjiangoF ...

  9. Django的Form

    Django的Form有两个基本用途: 1.用于生成html的Form表单 2.用于后台做表单验证 #!/usr/bin/env python # -*- coding:utf-8 -*- impor ...

  10. python Django之Form组件

    python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...

随机推荐

  1. 蓝牙mesh组网实践(配网方式的选择)

    目录 本测试基于CH582m单片机,尝试进行简单的组网. 沁恒官方EVT中提供了两种配网方式--配网器配网和自配网. ①配网器配网:用一个设备(一块582开发板)作为配网器,也就是沁恒蓝牙mesh软件 ...

  2. VS2015+QT5.10项目中文乱码

    解决:文件-高级保存选项,选择utf-8编码.

  3. unity简单物理系统

    目录 技术概述 技术详述 2D物理系统组件 刚体 碰撞器 物理材质 碰撞检测函数 在主角中的使用 移动 长跳跃与短跳跃 二段跳 攀爬(蹬墙跳) 技术使用中遇到的问题和解决过程 技术概述 物理系统,就是 ...

  4. C - Perform the Combo

    C - Perform the Combo 思路:当读到这个题的时候,第一反应就是枚举,但是,无线超时,没办法,那就变,利用前缀和,减少时间. 代码: #include<iostream> ...

  5. java中线程的两种创建方式

    第一种:继承java.lang.Thread类.然后重写run方法 例如我们模拟一个龟兔赛跑 1 package edu.aeon.thread; 2 3 /** 4 * 说明:模拟龟兔赛跑 5 * ...

  6. vite实现element-plus按需配置,自定义主题和读取/修改系统主题色

    项目地址 vite.config.ts 插件和vite配置 import { defineConfig } from "vite"; import vue from "@ ...

  7. 直播软件源码,uniapp滚动条置顶实现

    直播软件源码,uniapp滚动条置顶实现 实现功能: uniapp置顶滚动条.自定义页面滚动条的位置 实现代码: uni.pageScrollTo({    scrollTop: 0,    dura ...

  8. 物理核与逻辑核-转 perf

    Linux和Windows 物理CPU.物理核.逻辑核--区别.关系和查看  cat /proc/cpuinfo命令部分输出信息的含义 physical id 物理封装的处理器的idprocessor ...

  9. next_permutation / prev_permutation 用法

    给定输入的序列 a(整数即可,其他无限制条件),next_permutation(a + 1, a + n + 1) 可以求出 a 的关于值的下一个排列,prev_permutation(a + 1, ...

  10. OpenLayer——绘制带箭头的线

    绘制带箭头的线,计算相对复杂,多少是有点影响性能了.更简单的做法:初始.目标点用不同的点进行强调即可. <!DOCTYPE html> <html lang="en&quo ...