首页 > 其他分享 >Django10

Django10

时间:2022-12-21 20:11:57浏览次数:63  
标签:obj Django10 form 中间件 request 校验 forms

forms组件渲染标签

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

image

渲染成无序列表形式
image

<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 }}

image

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

image
只渲染类里写的字段,如果要使用按钮之类的需要自己写,类中意外的字段都不会自动渲染

forms组件展示信息

1.form表单如何取消浏览器自动添加的数据校验功能

前端的校验是弱不禁风的 最终都需要后端来校验 所以我们在使用forms组件的时候可以直接取消前端帮我们的校验
	<form action="" novalidate>
  
  <form action="" method="post" novalidate>
{#    novalidate不做任何校验#}
    {% for form in form_obj %}
    <p>{{ form.label }}
            {{ form }}
   </p>
    <input type="submit" value="提交">
{% endfor %}
</form>
 

2.错误信息展示

"""后端不同请求放回的forms对象一定要是相同的变量名"""
def ab_forms_func(request):
  # 1.产生一个空对象
  form_obj = MyForm()
  if request.method == 'POST':
    form_obj = MyForm(request.POST)  # request.POST可以看成一个字典 直接传给form类校验 字典中无论有多少键值对都没关系 只在乎类中编写的
    if form_obj.js_valid()  # 检验数据是否合法
        print(form_obj.cleaned_data)
    else:
      print(form_obj.errors)
   # 2.将该对象传递给HTML文件
  return render(render, 'formsPage.html', locals())
<form action="" method="post" novalidate>
{#    novalidate不做任何校验#}
    {% for form in form_obj %}
    <p>
        {{ form.label }}{{ form }}
        <span style="color: red">{{ form.errors.0 }}</span>
    </p>

{% endfor %}
    <input type="submit" value="提交">
</form>

image

3.错误信息改为中文

3.1自定义内容
给字段对象添加errors_messages参数

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

image\

3.2修改系统语言环境

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

image
image
image

forms组件校验补充

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

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

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

直接填写如:max_length min_length

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

使用正则表达式 validators

导一个正则校验模块

img

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

img

展示

img

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

第三种类型:钩子函数

很多组件里都有钩子函数 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

img

调取数据库中进行比对

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

img

多字段校验

img

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'})

forms组件源码剖析

切入口:form_obj.is_valid()

img

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

img

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 实现全自动

要对所有字段校验

img

img

前端HTML

img

展示:

img

save

img

django中间件

django中间件类似于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',
]

django中间件使用场景

全局相关的功能:
    全局用户身份校验,全局用户黑名单校验 全局用户访问频率校验
    中间件是可以拿到ip地址的,关于黑名单校验,它会进行判断,这个ip地址的身份,如果是黑名单用户,那么就直接不让他进入后面,直接pass掉它了,那么关于访问频率的校验,先设置多长时间内访问多少次,然后中间件进行识别计算看你出现过几次

django自定义中间件可以有五个方法

image

django自定义中间件可以有五个方法,每个方法都会在特定的场景下触发
它是由以下五个
    process_request
    process_response
    process_view(了解)
    process_template_response(了解)
    process_exception(了解)

定义中间件

如果想要写一些第三方的插件功能,可以在应用下创建一个文件,在这个文件下写一些py文件
1.定义中间件

image

from django.utils.deprecation import  MiddlewareMixin


class MyMdd1(MiddlewareMixin):
    def prcess_request(self, request):
        print('MyMdd1 process_request')


class MyMdd2(MiddlewareMixin):
    def prcess_request(self, request):
        print('MyMdd2 process_request')

2.配置中间件

image

1.process_request

1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回

image

image

2.process_response

1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
ps:如果请求的过程中process_request方法直接反悔了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)

image

image

标签:obj,Django10,form,中间件,request,校验,forms
From: https://www.cnblogs.com/zjl248/p/16997029.html

相关文章

  • django10 分页器与Form组件
    多对多创建第三张表的三种方式#1.全自动创建#优势:自动创建第三张表,并且提供了add,remove,set,clear四种操作与正反向查询#劣势:第三张表无法创建更多的字段,扩展性很......