• django-forms组件


    08.19自我总结

    django-forms组件

    一.forms的作用

    • 前端和后端都要校验
    • 前端校验的目的:减少后台代码连接数据库的压力

    用forms可以同时完成前端和后端同时校验且减少代码量

    二.forms的基本使用:

    1.定义数据的时候导入from类

    2.字段通过fields进行导入

    3.演示

    views.py

    
    from django.forms import Form
    from django.forms import fields
    class LoginForm(Form):
        ### 全部都是验证的规则
        username = fields.CharField(
            required=True,  ### 不能为空
            max_length=18,  ### 最大的长度是18
            min_length=6,   ### 最小的长度是6
            error_messages = {  ### 对英文进行重写
                "required" : "不能为空",
                "max_length":"太长了",
                "min_length":"太短了",
            }
        )
    
        pwd = fields.CharField()
    

    4.方法中对于传参进行定义

    views.py

    def login(request):
        if request.method == 'GET':
            return render(request, "login.html")
        else:
            # username = request.POST.get('username')
            # pwd = request.POST.get('pwd')
            obj = LoginForm(request.POST) ## {"username":'xx', 'pwd':'xx'}
            if obj.is_valid():
                print(obj.cleaned_data) ## 对象
                else:
                    print(obj.errors) ### 对象 __str__
    
                    return render(request, "login.html", {'obj':obj})
    

    5.html中对于返回值进行渲染

    login.html

    渲染方式一:

    <form action="/login/" method="post">
    	username: <input type="text" name="username">{{ obj.errors.username.0 }}<br>
        password: <input type="password" name="pwd">{{ obj.errors.pwd.0 }}<br>
    	<input type="submit" value="提交"><br>
    </form>			
    

    渲染方式二:

    #前提标题由forms组件进行
    {{obj.username}} #对于字段的input框
    {{obj.as_p }}#对象的所有字段
    {{obj.errors.username }}#对象的错误信息
    

    三.forms组件所有参数

    1.Field

    required=True,               是否允许为空
    widget=None,                 HTML插件
    label=None,                  用于生成Label标签或显示内容
    initial=None,                初始值
    help_text='',                帮助信息(在标签旁边显示)
    error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}
    validators=[],               自定义验证规则
    localize=False,              是否支持本地化
    disabled=False,              是否可以编辑
    label_suffix=None            Label内容后缀
    

    2.CharField(Field)

    max_length=None,             最大长度
    min_length=None,             最小长度
    strip=True                   是否移除用户输入空白
    

    3.IntegerField(Field)

    max_value=None,              最大值
    min_value=None,              最小值
    

    4.FloatField(IntegerField)

    max_value=None,              最大值
    min_value=None,              最小值
    

    5.DecimalField(IntegerField)

    max_value=None,              最大值
    min_value=None,              最小值
    max_digits=None,             总长度
    decimal_places=None,         小数位长度
    

    6.BaseTemporalField(Field)

    input_formats=None          时间格式化   
    

    7.DateField(BaseTemporalField)

     格式:2015-09-01
    

    8.TimeField(BaseTemporalField)

     格式:11:12
    

    9.DateTimeField(BaseTemporalField)

    格式:2015-09-01 11:12
    

    10.DurationField(Field)

     时间间隔:%d %H:%M:%S.%f
    

    11.RegexField(CharField)

    regex,                      自定制正则表达式
    max_length=None,            最大长度
    min_length=None,            最小长度
    error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'}
    

    12.EmailField(CharField)

    13.FileField(Field)

    allow_empty_file=False     是否允许空文件
    

    14.ImageField(FileField)

      注:需要PIL模块,pip3 install Pillow
        以上两个字典使用时,需要注意两点:
            - form表单中 enctype="multipart/form-data"
            - view函数中 obj = MyForm(request.POST, request.FILES)
    

    15.URLField(Field)

    16.BooleanField(Field)

    17.NullBooleanField(BooleanField)

    18.ChoiceField(Field)

    choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)
    required=True,             是否必填
    widget=None,               插件,默认select插件
    label=None,                Label内容
    initial=None,              初始值
    help_text='',              帮助提示
    

    19.ModelChoiceField(ChoiceField)

       ...                        django.forms.models.ModelChoiceField
        queryset,                  # 查询数据库中的数据
        empty_label="---------",   # 默认空显示内容
        to_field_name=None,        # HTML中value的值对应的字段
        limit_choices_to=None      # ModelForm中对queryset二次筛选
    

    20.ModelMultipleChoiceField(ModelChoiceField)

     ...                        django.forms.models.ModelMultipleChoiceField
    

    21.TypedChoiceField(ChoiceField)

    coerce = lambda val: val   对选中的值进行一次转换
    empty_value= ''            空值的默认值
    

    22.MultipleChoiceField(ChoiceField)

    23.TypedMultipleChoiceField(MultipleChoiceField)

    coerce = lambda val: val   对选中的每一个值进行一次转换
    empty_value= ''            空值的默认值
    

    24.ComboField(Field)

       fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式
                                   fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
    

    25.MultiValueField(Field)

    PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
    

    26.SplitDateTimeField(MultiValueField)

    input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']    input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
    

    27.FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中

    path,                      文件夹路径
    match=None,                正则匹配
    recursive=False,           递归下面的文件夹
    allow_files=True,          允许文件
    allow_folders=False,       允许文件夹
    required=True,
    widget=None,
    label=None,
    initial=None,
    help_text=''
    

    28.GenericIPAddressField

    protocol='both',           both,ipv4,ipv6支持的IP格式
    unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
    

    29.SlugField(CharField)

    数字,字母,下划线,减号(连字符)

    30.UUIDField(CharField)

    uuid类型

    四.相关参数使用演示

    from django.forms import Form
    from django.forms import fields
    from django.forms import Widget,PasswordInput
    class LoginForm(Form):
        username = fields.CharField(
            required=True,
            # label='用户名',
            # initial=666,
            # help_text='帮助信息',
            # # disabled=True,
            # label_suffix='--->',
            max_length=18,
            min_length=6,
            error_messages={
                'required' : '用户名不能为空',
                'max_length': '用户名不能超过18',
                'min_length': '用户名最小为6',
            }
        )
        # password = fields.IntegerField(
        #     required=True,
        #     max_value=99999999,
        #     min_value=100000,
        #     error_messages={
        #         'required' : '密码不能为空',
        #         'invalid'  :  '格式不正确',
        #         'min_value': '密码最少六位',
        #         'max_value': '密码最多12位',
        #     },
        #     # widget=PasswordInput
        # )
        email = fields.EmailField()
    def login(request):
        if request.method == 'GET':
            obj = LoginForm()
            print(obj)
            return render(request, 'login.html', {'obj':obj})
        else:
            # username = request.POST.get('username')
            # print(username)
            obj = LoginForm(request.POST)
            if obj.is_valid():
                print(obj.cleaned_data)
            else:
                errors = obj.errors
                # <ul class="errorlist">
                #   <li>username
                #       <ul class="errorlist">
                #           <li>This field is required.</li>
                #       </ul>
                #   </li>
                # </ul>
                # print(type(errors))
                # print(errors)
            return render(request, 'login.html', {'obj' : obj})
    

  • 相关阅读:
    创建类型5-3:单例模式(Singleton Pattern)
    创建类型5-2:抽象工厂模式(Abstract Factory Pattern)
    创建类型5-1:工厂模式(Factory Pattern)
    第一章:Netty介绍
    第二章:第一个Netty程序
    第四章:Transports(传输)
    第十六章:从EventLoop取消注册和重新注册
    第十五章:选择正确的线程模型
    第十四章:实现自定义的编码解码器
    第十三章:通过UDP广播事件
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11377441.html
Copyright © 2020-2023  润新知