forms组件渲染标签 form组件展示信息 forms组件校验补充 forms组件参数补充 forms组件源码分析 modelform组件 Django中间件

form组件渲染标签

渲染方式1

首先提前写好一个form组件的类 用这个类产生的对象再传到前端

image

前端.as_p
image

结果
image

拓展性差 破坏页面结构三个P标签 主要用于本地测试

image

点as_ul 结果:
image

点as_table 结果:

image

添加label参数

image

结果: 有label就会展示label 没有则用username首字母大写

image

可配置的参数称作组件

渲染方式2:

将其拆开去点label相当于一个label标签 点username相当于一个input标签

image

缺点:封装程度过低 拓展性高 编写麻烦

image

那么以上两种方式都过于麻烦

渲染方式3:

固定的代码 对空对象进行for循环 那么循环出来的变量名就是用户要输入的一个个框 再点label就是对每一个框对应的注释

image

展示

image

且后端组件里可以添加多个

image

forms组件只负责渲染用户数据的标签除此之外其他都得自己写 比如form标签及按钮都需要自己写

image

forms组件的渲染展示 自动有提示的检验功能

image

但这种前端的校验是弱不禁风的 那么可以让前端不校验 配参数直接将用户输入的发送到后端去 form标签中添加novalidate参数

image

form组件展示信息

对用户输入的信息在后端进行校验 那么后端如何把校验是否正确的信息再返回展示到前端呢?

将request.POST看做是一个字典交给一个类 无论大字典里有多少都无所谓

如图中form_obj两个变量名得是一样 但是呢请求所绑定的值是不一样的

两次请求中一个是get请求的空对象 一个是post提交含有数据的对象

image

那么如何将报错信息发送到前端?

点errors 展示错误信息

image

结果展示

image

如图发现多了个ul标签 将页面布局破坏了

那么就有固定的写法form_obj.errors.0 只展示它的文本信息 不展示标签

image

结果展示

image

自定义内容

方式1:给字段对象添加errors_messages参数

给字段对象添加errors_messages参数

	username = forms.CharField(min_length=3, max_length=8, label='用户名',
                               error_messages={
                                   'min_length': '用户名最少三个字符',
                                   'max_length': '用户名最多八个字符',
                                   'required': '用户名不能为空'
                               }
                               )

image

只要不符合就触发error_messages拿字典里的键取值展示出错误信息
image

那么针对上式方式太累了就有

方式2:修改系统语言环境

修改系统语言环境 setting里修改 Django底层的配置文件

from django.conf import global_settings  django内部真正的配置文件

image

forms组件校验补充

比如:想校验其他的 比如手机号开头 那如何校验

forms组件针对字段数据的校验 提供了三种类型的校验方式(三种校验方式可以一起使用)

第一种类型:直接填写参数

直接填写如:max_length min_length

第二种类型:使用正则表达式

使用正则表达式 validators

导一个正则校验模块

image

第一个参数填写正则 第一个参数填写不符信息 并且可以写多个

image

展示

image

以上校验校验是单单针对某一个字段的条件 那如果我的校验是有逻辑的 比如校验用户名是否已存在 校验两次密码是否一致 就有第三种

第三种类型:钩子函数

很多组件里都有钩子函数 form类中编写函数 自己写代码 定义校验规则

	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_data.get('confirm_pwd')
            if not password == confirm_pwd:
                self.add_error('confirm_pwd', '两次密码不一致')
            return self.cleaned_data

image

调取数据库中进行比对

单字段校验 钩什么就得return返回什么

image

多字段校验

image

forms组件参数补充

label字段注释

initial默认值

image

required:规定是否可以不填写 默认是Ture是必须要填的

False 可以不填

image

密码是明文展示的?
image

字段属性和字段样式怎么操作?form contrl也加不了 怎么去渲染?

那么就有 widget控制标签的各项属性

默认没提示 要提示得导模块

image

image

展示:

image

要有样式的话:

image

attrs填写可以填写默认属性 自定义属性 多个的话空格隔开

image

单选框:

image

展示:

image

initial

初始值,input框里面的初始值

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三"  # 设置默认值
    )
    pwd = forms.CharField(min_length=6, label="密码")

error_messages

重写错误信息

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="密码")

password

class LoginForm(forms.Form):
    ...
    pwd = forms.CharField(
        min_length=6,
        label="密码",
        widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
    )

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组件源码分析

切入口:form_obj.is_valid()

image

意味着两边and连接的都是True

image

modelform组件

"""
我们学习校验性组件的目的 绝大部分是为了数据录入数据库之前的各项审核
forms组件使用的时候需要对照模型类编写代码 不够方便
"""
forms组件的强化版本 更好用更简单更方便!!!

from django import forms
from app01 import models


class MyModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo
        fields = '__all__'
        labels = {
            'username':'用户名'
        }


def ab_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()  # models.UserInfo.objects.create(...)/update(...)
        else:
            print(modelform_obj.errors)
    return render(request, 'modelFormPage.html', locals())

强化版form 实现全自动

要对所有字段校验

image

image

前端HTML

image

展示:

image

save

image

Django中间件

中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求

Django默认有七个中间件 并且还支持用户自定义中间件

image

如何自定义中间件

	1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)
	2.参考自带中间件的代码编写类并继承
 	3.在类中编写五个可以自定义的方法
    4.一定在配置文件中注册中间件才可以生效

需要掌握的

 #  process_request
1.请求来的时候会从上往下依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回
#  process_response
1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.该方法有两个先request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
             '''如果在执行process_request方法的时候直接返回了HttpResponse对象那么会原路返回执行process_response 不是执行所有'''
需要了解的
process_view
process_exception
process_template_response

字符串的模式导模块

image

怎自己定义中间件并且里面还支持5个方法

首先要创建储存中间的目录或者py文件

image

模仿抄别人有的 参考自带中间件的代码

process_request

process_response

自定义:

image

一定要在配置文件中注册

image

执行流程

image

结合Django的生命周期流程图

image

还可以添加models

image

请求来的时候从上往下

image

返回响应从下到上

image

形参response就是后端返回给前端的数据

image

posted @ 2022-12-21 19:58  小福福  阅读(42)  评论(0编辑  收藏  举报