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组件有以下几个功 ...
随机推荐
- Xdebug调试环境配置
首先我们需要下载Xdebug 务必根据安装的PHP版本,选择合适的Xdebug版本,由于我是在Windows环境下安装PHP的,选择下载Windows版本的PHP 5.3 VC9 TS (32 bit ...
- Hyperledger Fabric密码模块系列之BCCSP(三)
fabric中通过工厂模式来生成bccsp实例,进而通过bccsp的接口来提供加密.解密.签名验证以及哈希等操作. fabric的factory工厂默认返回的bccsp实例是sw(也就是所有密码操作都 ...
- Repeater 控件的嵌套使用
Repeater 控件的嵌套使用 ItemDataBound:数据绑定的时候(正在进行时)发生,多用在Repeater控件嵌套,对子Repeater控件进行数据绑定及模板列中统计列的计算处理等 ...
- hadoop 集群中数据块的副本存放策略
HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性.可用性和网络带宽的利用率.目前实现的副本存放策略只是在这个方向上的第一步.实现这个策略的短期目标是验证它在生产环境下的有效 ...
- [PHP] 算法-镜像二叉树的PHP实现
操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 思 ...
- 【Spring】1、Spring 中的监听器 Listener
一.接口 1.EventListener 2.HttpSessionAttributeListener 继承EventListener接口 HttpSessionAttributeListener ...
- How to Find the Standard Deviation in Minitab
Standard deviation, represented by the Greek Letter sigma σ, is a measure of dispersement in statist ...
- Linux常用基本命令:三剑客命令之-sed
sed是一个很强大的文件处理工具,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作 格式:sed [option] [command] [file] 常用命令: a ∶新 ...
- python爬虫简单代码爬取郭德纲单口相声
搜索老郭的单口相声,打开检查模式,刷新 没有什么有价值的东东, 不过....清掉内容, 点击一个相声,再看看有些什么 是不是发现了些什么 我们来点击这个看看, 首先看一下headers, 这个url是 ...
- Python全栈学习_day010作业
1,继续整理函数相关知识点,写博客. 2,写函数,接收n个数字,求这些参数数字的和.(动态传参)def MySum(*args): sum = 0 for i in range(len(args)): ...