今日内容

forms组件渲染标签

forms组件渲染标签的方式1

    <p>forms组件渲染标签的方式1</p>    
    {{ form_obj.as_p }}   
    {{ form_obj.as_table }    
    {{ form_obj.as_ul }}
'''封装程度高 扩展性差 主要用于本地测试'''

forms组件渲染标签的方式2

    <p>forms组件渲染标签的方式2</p>
    <p style="color: red">label标签和form分开写</p>
    {{ form_obj.username.label }}
    {{ form_obj.username }}
    {{ form_obj.age.label }}
    {{ form_obj.age }}
    {{ form_obj.email.label }}
    {{ form_obj.email }}
'''封装程度过低 扩展性高 编写麻烦'''

forms组件渲染标签的方式3

    <p>forms组件渲染标签的方式3</p>
    {% for form in form_obj %}
        {{ form.label }}
        {{ form }}
    {% endfor %}
'''封装程度较高 扩展性高 编写简单 推荐使用'''

注意事项

	forms组件只负责渲染获取用户数据的标签 form标签和按钮都需要自己写
    前端的校验可以随意更改 最终都需要后端校验 在使用forms组件的时候可以直接取消前端帮我们的校验
    <form action="" novalidate>

forms组件展示信息

后端不同请求返回的forms对象一定要是相同的变量名

def ad_forms_func(request):
    #1.产生一个空对象
    form_obj = MyForm()
    if request.method == 'POST':
        form_obj=MyForm(request.POST) 
        #requestPOST可以看成是一个字典 直接传给forms类进行校验 字典中无论有多少键值对都没关系 只在乎类中编写的
        if form_obj.is_valid():#判断数据是否合法
            print(form_obj.cleaned_data)
        else:
            print(form_obj.errors)
     #2.将该对象传递给html页面
   	 return render(request,'formsPage.html',locals())

错误信息

<form action="" method="post" novalidate>
    {% for form in form_obj %}
        <p>
            {{ form.label }}
            {{ form }}
        <span>{{ form.errors.0 }}</span> #固定这样写
        </p>
        

针对错误信息的提示可以修改成各国语言

方式1:自定义内容

	给字段添加error_messages参数
    error_messages={'max_length':'用户名最多8个字',
					'min_length':'用户名最少两个字',
					'required':'用户名不能为空',
												 }

	error_messages={'required':'邮箱不能为空',
                    'invalid':'邮箱格式不对'}

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

from django.conf import global_settings
改成简体中文

forms组件校验补充

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

第一种类型:

直接填写函数:直接填写参数			max_length

第二种类型:

使用正则表达式:                    validators
	from django.core.validators import RegexValidator
    
    phone = forms.CharField(validators=							[RegexValidator(r'^[0-9]+$','请输入数字'),
             RegexValidator(r'^159[0-9]+$','数字必须是以159开头')
                                                       '''                                                        每个字段都可以加validators字段 
   可以写多个RegexValidator参数                         '''

第三种类型:

钩子函数							编写代码自定义校验规则

在类中编写函数
	class MyForm(forms.Form):
    	username = forms.CharField(max_length=8, min_length=2, label='用户名')
		#局部钩子
    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
    
#钩子函数>>>:数据已经通过上述校验以后 相当于最后一个关卡 在所				  有的校验参数之后触发 
#局部钩子:每次只校验一个字段数据     校验用户是否已存在
#全局钩子:一可以校验多个字段数据     校验两次密码是否一致
'''
注意:拿什么就要返回什么 拿所有返回所有
'''

forms组件参数补充

min_length				最小字符
max_length				最大字符
min_value				最小值
max_value				最大值
label					字段注释
error_messages			错误提示
validators				正则校验器
initial					默认值
required				是否必填
widget					控制标签的各项属性

forms组件源码剖析

forms组件渲染标签、展示信息、校验数据的一些补充,forms组件参数和源码剖析,modelform组件,Django中间-小白菜博客

切入口:form_obj.is_valid()

modelform组件

'''
我们学习校验型组件的目的 绝大部分是为了数据录入数据库之前的各项审核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())

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