Django之Form进阶
s6day76
内容回顾:
Form组件:
- 类 继承Form
- 字段 字段
- 实例化
- is_valid()
- cleaned_data
- errors
Form 组件:
class TeacherForm(Form):
username = fields.CharField(
required=True,
error_messages={'required':'用户名不能为空'},
widget=widgets.TextInput(attrs={'placeholder':'用户名','class':'form-control'})
) # 不能为空
password = fields.CharField(required=True,error_messages={'required':'密码不能为空'}, widget=widgets.TextInput(attrs={'placeholder':'密码','class':'form-control'})) # 不能为空
email = fields.EmailField(required=True,error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'},widget=widgets.EmailInput(attrs={'placeholder':'邮箱','class':'form-control'})) # 不能为空,且邮箱格式
def add_teacher(request):
if request.method == 'GET':
form = TeacherForm()
return render(request,'add_teacher.html',{'form':form})
else:
"""
1. 用户请求数据验证
2. 自动生成错误信息
3. 打包用户提交正确信息
4. 错误:保留上次输入内容
5. 定制页面上显示的HTML标签
Django Form组件
1. 创建规则(类,字段)
class Foo:
username = xxx
password = xxx
email = xxx
2. 数据和规则进行匹配
"""
form = TeacherForm(data=request.POST) # 数据和规则放置一起
if form.is_valid(): # 开始校验,并获取校验结果
# print('执行成功',form.cleaned_data) # 所有匹配成功,字典
# {'username': 'asd', 'password': 'sdf', 'email': 'sadf@live.com','ut_id':1}
form.cleaned_data['ut_id'] = 1
models.UserInfo.objects.create(**form.cleaned_data)
return redirect('/teachers/')
return render(request, 'add_teacher.html',{'form':form})
Django生命周期:客户请求首先来到wsgi,接着来到路由系统在走到views视图,如果和数据库打交道就通过ORM和数据库建立链接。拿到数据后和模板一起柔和在一起在渲染发给前端,发给前端的是字符串。
py2、py3字符串:
py2:
字符串(utf-8/gbk编码之后值) unicode
py3:
bytes(utf-8/gbk编码之后值) 字符串(unicode)
Http请求本质是: 消息头与返回体之间用2个\r\n 分开 之间用一个\r\n
今日内容:
1. 班级管理
2. 学生管理
3. 老师管理
内容详细:
1. 班级管理
使用这种方法定义Form验证时:数据源无法更新
class ClassForm(Form):
caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
# headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
headmaster_id = fields.ChoiceField(choices=models.UserInfo.objects.filter(ut_id=2).values_list('id','username'))
def class_add(request):
if request.method == 'GET':
form = ClassForm()
return render(request,'class_add.html',{'form':form})
else:
form = ClassForm(data=request.POST)
if not form.is_valid():
return render(request, 'class_add.html', {'form': form})
models.ClassList.objects.create(**form.cleaned_data)
return redirect('/class_list/')
1. headmaster_id
2. 数据源无法实施更新,重写构造方法
方式一(推荐):
class ClassForm(Form):
caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
# headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
headmaster_id = fields.ChoiceField(choices=[])
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.fields['headmaster_id'].choices = models.UserInfo.objects.filter(ut_id=2).values_list('id','username')
方式二:
from django.forms.models import ModelChoiceField
class ClassForm(Form):
caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
# headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
headmaster_id = ModelChoiceField(queryset=models.UserInfo.objects.filter(ut_id=2))
2. 学生管理(同上)
3. 老师管理
编辑老师:
1. URL跳转
2. 根据nid获取当前老师所有信息:用户名,密码,邮箱,任课所有班级
3. form生成HTML和默认值
4. 用户登录
- form的字段可以定义正则表达式
password = fields.CharField(
required=True,
min_length=3,
max_length=18,
error_messages={
'required': '密码不能为空',
'min_length': '密码长度不能小于3',
'max_length': '密码长度不能大于18',
'invalid': '密码格式错误',
},
validators=[RegexValidator('\d+','只能是数字') ]#定义正则表达式
)
- 主动向form中添加错误信息这个是用在通过了Form判断但是没有通过数据库判断
# form.add_error('password','用户名或密码错误')
form.add_error('password',ValidationError('用户名或密码错误'))
5. Form扩展(钩子函数)
6. 中间件
Django中中间件是什么?
- 是一个类
内容总结:
1. Form基本使用
- 类
- 字段
- is_valid
- cleaned_data
- errors
2. 字段参数:
- max_length
- min_length
- validators = [RegexValidator('xxx')]
3. 钩子函数
- clean_字段名
注意:
必须有返回值
只能拿自己当前字段值
raise ValidationError('xxx')
4. 下拉框数据源实时更新
- 重写构造方法
__init__
- 先执行父类构造方法
- self.fields['xx'].choices = xxxxx
- ModelChoiceField
5. 中间件
- 中间件是什么?是一个类
- 返回值注意 request返回要谨慎, response有返回值,
- 做过什么:
- 用户登录
- 日志记录
- csrf
- session
- 权限管理***
Django之Form进阶的更多相关文章
- Django的Form(二)
上一篇已经简单介绍了Django的Form,现在开始进阶操作了 ..... 创建Form类的时候,主要涉及到Form字段和Form的插件,字段用于做form验证,插件用来生成HTML DjiangoF ...
- 【python】-- Django ORM(进阶)
Django ORM(进阶) 上一篇博文简述了Django ORM的单表操作,在本篇博文中主要简述Django ORM的连表操作. 一.一对多:models.ForeignKey() 应用场景:当一张 ...
- Django之Form与ModelForm组件
Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...
- Django之Form组件
Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...
- Django models Form model_form 关系及区别
Django models Form model_form
- 【Django】--Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 例子: 1.创建Form类 from djan ...
- Django基础——Form&Ajax篇
一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...
- Python之路【第二十一篇】:Django之Form组件
Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...
- 第十一篇:web之Django之Form组件
Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...
随机推荐
- MySQL 解压缩版安装 2017-12-02(完整版,包括异常处理)
一.安装 1.到mysql官网 http://dev.mysql.com/downloads/mysql/ 下载mysql 注:msi的是安装版 zip是压缩版 2.解压 解压到想安装的目录下 ...
- 深入浅出 JVM GC(4)常用 GC 参数介绍
# 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我 ...
- Owin 自寄宿 asp.net web api
http://owin.org/ Owin 定义了webserver和webapplication之间的标准接口,目标就是为了解耦webapplication对webserver的依赖, 就是说以后可 ...
- Hive数据倾斜
数据倾斜是进行大数据计算时最经常遇到的问题之一.当我们在执行HiveQL或者运行MapReduce作业时候,如果遇到一直卡在map100%,reduce99%一般就是遇到了数据倾斜的问题.数据倾斜其实 ...
- Java 面向对象编程小练习(曾经)
最近打算将之前学习过的小练习分享出来,算是巩固知识.虽然是小练习,但是越看越觉得有趣,温故而知新. 练习:功能跳水比赛,8个评委评分.运动员成绩去掉最高和最低之后的平均分 代码实例: 1.导包 imp ...
- elasticsearch6.7 05. Document APIs(1)data replication model
data replication model 本节首先简要介绍Elasticsearch的data replication model,然后详细描述以下CRUD api: 1.读写文档(Reading ...
- JPA与EJB3的关系
JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差异,它的出现在某种程度上能够解决目前ORM框架之间不能够兼容的问题,对开发人员来说,能够更好的在JPA规范下进行系统开发. JPA全称 ...
- 了解java虚拟机—在TALB上分配对象(10)
由于对象一般会分配在堆上,而堆是全局共享的.因此在同一时间,可能有多个线程在堆上申请空间.每次对象分内都必须要进行同步,因此TLAB这种线程专属的区域来避免多线程冲突.TLAB本身占用了eden区的空 ...
- Java集合之HashMap源码分析
以下源码均为jdk1.7 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现. 提供所有可选的映射操作, 并允许使用null值和null健. 此类不保证映射的顺序. 需要注意的是: ...
- Linux Centos下安装jdk
1.准备工作 https://www.cnblogs.com/dddyyy/p/9746942.html 上面这篇博客讲了如何安装linux 你想安装的jdk(对应版本的jdk) 连接Linux的软件 ...