django框架

61 阅读5分钟

forms组件渲染标签

<p>forms组件渲染标签的方式1(封装程度过高 扩展性差 主要用于本地测试):</p>
    {#    {{ form_obj.as_p }}#}
    {#    {{ form_obj.as_ul }}#}
    {#    {{ form_obj.as_table }}#}
<p>forms组件渲染标签的方式2(封装程度过低 扩展性高 编写麻烦)</p>
    {#    {{ form_obj.username.label }}#}
    {#    {{ form_obj.username }}#}
    {#    {{ form_obj.age.label }}#}
    {#    {{ form_obj.age }}#}
    {#    {{ form_obj.email.label }}#}
    {#    {{ form_obj.email }}#}
<p>forms组件渲染标签的方式3(封装程度较高 扩展性高 编写简单 推荐使用)</p>
    {#    {% for form in form_obj %}#}
    {#        <p>#}
    {#            {{ form.label }}#}
    {#            {{ form }}#}
    {#        </p>#}
    {#    {% endfor %}#}

注意事项
        forms组件之负责渲染获取用户数据的标签 也就意味着form标签与按钮都需要自己写
        前端的校验是弱不禁风的 最终都需要后端来校验 所以我们在使用forms组件的时候可以直接取消前端帮我们的校验
        <form action="" novalidate>
        
        

forms组件展示信息

后端不同请求返回的forms对象一定是相同的变量名
def ab_forms_func(request):
    # 1.产生一个空对象
    form_obj = MyForm()
    if request.method == 'POST':
        form_obj = MyForm(request.POST)  # request.POST可以看成是一个字典 直接传给forms类校验 字典中无论有多少键值对都没关系 之在乎类中编写的
        if form_obj.is_valid():  # 校验数据是否合法
            print(form_obj.cleaned_data)
        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_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				控制标签的各项属性
        widget=forms.widgets.PasswordInput(attrs={'class': 'form-control', 'username': 'jason'})
        
        

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())
    

django中间件

django默认有七个中间件 并且还支持用户自定义中间件 中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求

image.png

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.一定在配置文件中注册中间件才可以生效
    
    

自定义中间的步骤:

  • 在 app 目录下新建一个 py 文件,名字自定义,并在该 py 文件中导入 MiddlewareMixin:

image.png

  • 在 settings.py 中的 MIDDLEWARE 里注册自定义的中间件类:

      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',  
    
      'app01.middlewares.MD1',  
      ]
      
    

自定义中间件类的方法

  • 自定义中间件类的方法有:process_request 和 process_response。

image.png

  • process_request 方法有一个参数 request,这个 request 和视图函数中的 request 是一样的。

      process_request 方法的返回值可以是 None 也可以是 HttpResponse 对象。
    
     返回值是 None 的话,按正常流程继续走,交给下一个中间件处理。
     返回值是 HttpResponse 对象,Django 将不执行后续视图函数之前执行的方法以及视图函数,直接以该中间件为起点,倒序执行中间件,且执行的是视图函数之后执行的方法。
    
      process_request 方法是在视图函数之前执行的。
    
      当配置多个中间件时,会按照 MIDDLEWARE中 的注册顺序,也就是列表的索引值,顺序执行。
    
      不同中间件之间传递的 request 参数都是同一个请求对象。
      
    
  • process_response

      process_response 方法有两个参数,一个是 request,一个是 responserequest 是请求对象,response 是视图函数返回的 HttpResponse 对象,该方法必须要有返回值,且必须是response。
    
      process_response 方法是在视图函数之后执行的。
    
      当配置多个中间件时,会按照 MIDDLEWARE 中的注册顺序,也就是列表的索引值,倒序执行
      
    

image.png