首页 > 编程语言 >python之路54 forms组件 渲染 展示 参数补充 modelform组件 django中间件

python之路54 forms组件 渲染 展示 参数补充 modelform组件 django中间件

时间:2022-12-21 21:00:49浏览次数:42  
标签:obj form python 中间件 校验 forms length 组件

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参数
class MyForm(forms.Form):
    username = forms.CharField(min_length=3, max_length=8,label='用户名'
                               ,error_messages={
                                   'min_length':'用户名最少三个字符',
                                   'max_length':'用户名最多八个字符',
                                   'required':'用户名不能为空'
                               })
    age = forms.IntegerField(min_value=0, max_value=200,label='年龄',
                             error_messages={
                                 'min_value':'年龄不能小于0岁',
                                 'max_value':'年龄不能大于200岁',
                                 'required': '年龄不能为空 你没得',
                             })
    email = forms.EmailField(error_messages={
                                 'required':'邮箱不能为空',
                                 'invalid': '邮箱格式不对' ,})
方式2:修改系统语言环境
    from django.conf import global_settings
    django内部真正的配置文件

forms组件校验补充

forms组件针对字段数据的校验 提供了三种类型的校验方式(可以一起使用)
       第一种类型:直接填写参数      max_length
       第二种类型:使用正则表达式    validators
phone = forms.CharField(
        validators=[RegexValidator(r'^[0-9]+$', '请输入数字'),
                    RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
    )
       第三种类型:钩子函数          编写代码自定义校验规则
class MyForm(forms.Form):
    username = forms.CharField(min_length=3, max_length=8, label='用户名',)
    password = forms.CharField(min_length=3, max_length=8, label='密码',)
    confirm_pwd = forms.CharField(min_length=3, max_length=8, 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               控制标签的各项属性
  class MyForm(forms.Form):
    username = forms.CharField(min_length=3, max_length=8, label='用户名',widget=forms.widgets.TextInput(attrs={'class':'form-control c1  c2 c3 c4 ','username':'jason'}) # type='text'
                              )
    password = forms.CharField(min_length=3, max_length=8, label='密码',          widget=forms.widgets.PasswordInput() # type='password'
                              )
    confirm_pwd = forms.CharField(min_length=3, max_length=8, label='确认密码', widget=forms.widgets.PasswordInput()  # type='password'
                                 )
选择标签
gender = forms.ChoiceField(
        choices=((1, "男"), (2, "女"), (3, "保密")),
        label="性别", initial=3, widget=forms.widgets.RadioSelect()
    )

forms组件源码剖析

切入口:form_obj.is_valid() 判断这个form组件的校验情况

modelform组件

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

from django import forms
from app01 import models

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



def ab_mf_func(request):
    modelform_obj = MyModelForm()
    if request.method == 'POST':
        modelform_obj = MyModelForm(request.POST)
        if modelform_obj.is_valid():
            modelform_obj.save()  # models.UserInfo.objects.create(...)/update(需要POST后面传个对象)

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

标签:obj,form,python,中间件,校验,forms,length,组件
From: https://www.cnblogs.com/xm15/p/16997241.html

相关文章