今日内容概要
- forms组件渲染标签
- forms组件展示信息
- forms组件校验补充
- forms组件参数补充
- forms组件源码剖析
- modelform组件
- django中间件
今日内容详细
forms组件渲染标签
方式1:封装程度过高 扩展性差 主要用于本地测试
{{ form_obj.as_p }} # 渲染为p标签
{{ form_obj.as_ul }} # 渲染为ul标签
{{ form_obj.as_table }} # 渲染为表格标签
方式2:封装程度过低 扩展性高 编写麻烦
{{ form_obj.username.label }}
{{ form_obj.username }}
{{ form_obj.age.label }}
{{ form_obj.age }}
{{ form_obj.email.label }}
{{ form_obj.email }}
"""
label属性默认展示的是类中定义的字段首字母大写的形式
也可以自己修改 直接给字段对象加label属性即可
username = forms.CharField(min_length=3,max_length=8,label='用户名')
"""
方式3:封装程度较高 扩展性高 编写简单 推荐使用
{% for form in form_obj %}
<p>{{ form.label }}</p>
<p>{{ form }}</p>
{% endfor %}
注意事项
forms组件只负责渲染获取用户数据的标签 也就意味着form标签与按钮都需要自己写
前端的校验是弱不禁风的 最终都需要后端来校验 所以我们在使用forms组件的时候可以直接取消前端帮我们做的校验
<form action="" novalidate>
forms组件展示信息
后端不同请求返回的forms对象一定要是相同的变量名
def forms_func(request):
# 1.产生一个空对象
form_obj = MyForm()
if request.method == 'POST':
fom_obj = MyForm(request.POST) # request.POST可以看成是一个字典 直接传给forms类校验 字典中无论有多少键值对都没有关系 只在乎类中编写的
if form_obj.is_valid(): # 校验数据是否合法
print(form_obj.cleaned_date)
else:
print(form_obj.errors)
# 2.将该对象传递给html文件
return render(request, 'formsPage.html', locals())
# 前端
{% for form in form_obj %}
<p>
{{ form.label }}
{{ form }}
<span>{{ form.errors.0 }}</span>
</p>
{% endfor %}
针对错误信息的提示可以修改成各国语言
方式1:自定义内容
给字段对象添加errors_messages参数即可
username = forms.CharField(min_length=3, max_length=8, label='用户名',error_messages={
'min_length': '用户名最少三个字符',
'max_length': '用户名最多八个字符',
'required': '用户名不能为空' })
方式2:修改系统语言环境
from django.conf import global_settings # django内部真正的配置文件
forms组件校验补充
forms组件针对字段数据的校验 提供了三种类型的校验方式(可以一起使用)
第一种类型:直接填写参数 max_length
第二种类型:使用正则表达式 validators
第三种类型:钩子函数 编写代码自定义校验规则
钩子函数>>>:校验的最后一环 是在字段所有的校验参数之后触发
class MyForm(forms.Form):
username = forms.CharField(min_length=3, max_length=8)
password = forms.CharField(min_length=3, max_length=8)
confirm_pwd = forms.CharField(min_length=3, max_length=8)
局部钩子:每次只校验一个字段数据
def clean_username(self):
username = self.cleaned_data.get('username')
if username == 'jason':
self.add_error('username', '用户名jason已经存在')
return username # 校验了哪个字段 就要把哪个字段返回出去
全局钩子:一次可以校验多个字段数据
def clean(self):
password = self.cleaned_data.get('password')
confirm_pwd = self.cleaned_date.get('confirm_pwd')
if not password == confirm_pwd:
self.add_error('confirm_pwd', '两次密码不一致')
return self.cleaned_date # 要将所有的字段返回出去
forms组件参数补充
min_length 最小字符
max_length 最大字符
min_value 最小值
max_value 最大值
label 字段注释
error_messages 错误提示
validators 正则校验器
initial 默认值
required 是否必填
widget 控制标签的各项属性
modelform组件
'''
我们学习校验性组件的目的 绝大部分是为了数据录入数据库之前的各项审核
forms组件使用的时候需要对照模型类编写代码 不够方便
'''
forms组件的强化版本 更好用更简单更方便
from django import forms
from app01 import models
class MyModelForm(forms.ModelsForm):
class Meta:
model = models.UserInfo
fields = '__all__'
labels = {'username': '用户名'}
def mf_func(request):
modelform_obj = MyModelForm()
if request.method == 'POST':
modelform_obj = MyModelForm(request.POST,instance=User_obj)
if modelform_obj.is_valid():
modelform_obj.save()
else:
print(modelform_obj.errors)
return render(request, 'modelFormPage.html', locals())
django中间件
django默认有七个中间件 并且还支持用户自定义中间件
中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
如何自定义中间件
1.创建存储自定义中间件代码的py文件或者目录
2.参考自带中间件的代码编写类并继承
3.在类中编写五个可以自定义的方法
4.一定要在配置文件中注册中间件才可以生效
需要掌握的三种方法
process_request
1.请求来的时候从上往下依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象 那么不再往后执行 而是直接原路返回
process_response
1.响应走的时候回从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.该方法有两个形参 request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
'''如果在执行process_request方法的时候直接返回了HttpResponse对象 那么会原路返回执行process_response 不是执行所有的'''
需要了解的
provess_view
process_exception
process_template_response
标签:obj,框架,form,校验,Django,forms,length,组件
From: https://www.cnblogs.com/lzjjjj/p/17019885.html