• Django form组件


    一、前提

    作用:

    生成HTML

    校验

    校验的结果显示在前端

    1、导入模块

    # form组件
    from django import forms
    # widgets form组件的小工具
    from django.forms import widgets

    2、定义类

    class RegForm(forms.Form):

    二、字段(类的属性)

    1、用户名

     # 用户名
        name = forms.CharField(
            label="用户名",
            # 最小长度
            min_length=4,
            max_length=8,
            # input的种类, 添加属性
            widget=widgets.TextInput(attrs={"class": "form-control"}),
            # 校验的错误信息的重新,默认是英文
            error_messages={
                "min_length": "用户名长度不能少于4位",
                "max_length": "用户名长度不能大于8位",
                # 不能为空
                "required": "用户名长度不能为空",
            }
        )

    2、密码

        # 密码,render_value= True ,当校验不通过时,保留原有内容
        pwd = forms.CharField(
            label="密码",
            min_length=8,
            max_length=10,
            # input的类型
            widget=widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True),
            error_messages={
                "min_length": "密码长度不能少于8位",
                "max_length": "密码长度不能大于10位",
                "required": "密码不能为空",
            }
        )

    3、邮件

     # 邮件
        email = forms.EmailField(
            label="邮件",
            # input类型 
            widget=widgets.EmailInput(
                attrs={"class": "form-control"},
            ),
            error_messages={
                "required": "邮件不能为空",
            "invalid": "邮件格式不正确"
    } )

    4、radio

        # 注意 ChoiceField RadioSelect
        gender = forms.ChoiceField(
            label="性别",
            widget=widgets.RadioSelect(),
            choices=((1, ""), (2, "")),
            initial=1
        )

    5、checkbox(单选)

        rem = forms.ChoiceField(
            label="记住密码",
            widget=widgets.CheckboxInput(),
            initial="checked",
        )

    6、checkbox(多选)

        hobby = forms.MultipleChoiceField(
            label="爱好",
            choices=((1, "篮球"), (2, "足球"), (3, "乒乓球")),
            widget=widgets.CheckboxSelectMultiple(),
            initial=[1, 3],
        )

    7、select(单选)

     # 城市,choice为选项的内容, initaial为初始的内容
        city = forms.ChoiceField(
            label="城市",
            widget=widgets.Select(attrs={"class": "form-control"},),
            choices=models.City.objects.all().values_list("id", "name"),
            initial=1
        )

    8、select(多选)

        # 多选select ,注意 MultipleChoiceField, SelectMultiple()
        city2 = forms.MultipleChoiceField(
            label="城市",
            choices=models.City.objects.all().values_list("id", "name"),
            widget=widgets.SelectMultiple(),
            initial=[1, 2],
        )

    注意:

    choice字段

    在使用选择标签时,需要注意choices的选项可以配置从数据库中获取,但是由于是静态字段 获取的值无法实时更新,需要重写构造方法从而实现choice实时更新。

    方法:

    from django.forms import Form
    from django.forms import widgets
    from django.forms import fields
    
     
    class MyForm(Form):
     
        user = fields.ChoiceField(
            # choices=((1, '上海'), (2, '北京'),),
            initial=2,
            widget=widgets.Select
        )
     
        def __init__(self, *args, **kwargs):
            super(MyForm,self).__init__(*args, **kwargs)
            # self.fields['user'].choices = ((1, '上海'), (2, '北京'),)
            #
            self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')

    总结:单选用ChoiceField,多选用MultipleChoiceField

    三、视图系统

    is_valid() 判断是否校验通过 cleaned_data存放校验通过的数据
    def reg(request):
        reg_obj = RegForm()
        if request.method == "POST":
            reg_obj = RegForm(request.POST)
            if reg_obj.is_valid():
                del reg_obj.cleaned_data["re_pwd"]
                # print(reg_obj.cleaned_data)
                models.UserInfo.objects.create(**reg_obj.cleaned_data)
                return HttpResponse("注册成功")
        return render(request, "reg.html", {"reg_bj": reg_obj})

    四、模板系统(用到了BootStrap)

    <div class="form-group {% if reg_bj.pwd.errors.0 %}
            has-error
            {% endif %}">
            <label for="{{ reg_bj.pwd.id_for_label }}">{{ reg_bj.pwd.label }}</label>
            {{ reg_bj.pwd }}
            <span class="help-block">{{ reg_bj.pwd.errors.0 }}</span>
    </div>

    五、字段校验

    1、正则校验

    from django.core.validators import RegexValidator
    
    
    # 手机号
        phone = forms.CharField(
            label="手机号",
            widget=widgets.TextInput(attrs={"class": "form-control"}),
            error_messages={
                "required": "手机号不能为空",
            },
            validators=[
                RegexValidator(r'^[0-9]+$', "手机号必须是数字"),
                RegexValidator(r'^1[358][0-9]{9}$', "手机号格式有误")
            ]
        )

    2、Hook(局部)

    from django.core.exceptions import ValidationError  
    # 校验name这个字段是否有敏感词汇  
    def clean_name(self):
            value = self.cleaned_data.get("name")
            if "" in value:
                raise ValidationError("敏感词汇")
            return value
    # 判断邮箱是否相同
    def clean_email(self):
        email = self.cleaned_data.get("email")
        is_exist = models.UserInfo.objects.filter(email=email)
        if is_exist:
            self.add_error("email", ValidationError("邮箱已存在"))
        return email

    3、Hook全局

    # 判断两次输入的密码是否相同    
    def clean(self):
            pwd = self.cleaned_data.get("pwd")
            re_pwd = self.cleaned_data.get("re_pwd")
            if pwd != re_pwd:
                self.add_error("re_pwd", "两次密码不一致")
                raise ValidationError("两次密码不一致")
            return self.cleaned_data

    六、Django from的内置字段

    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内容后缀
     
     
    CharField(Field)
        max_length=None,             最大长度
        min_length=None,             最小长度
        strip=True                   是否移除用户输入空白
     
    IntegerField(Field)
        max_value=None,              最大值
        min_value=None,              最小值
     
    FloatField(IntegerField)
        ...
     
    DecimalField(IntegerField)
        max_value=None,              最大值
        min_value=None,              最小值
        max_digits=None,             总长度
        decimal_places=None,         小数位长度
     
    BaseTemporalField(Field)
        input_formats=None          时间格式化   
     
    DateField(BaseTemporalField)    格式:2015-09-01
    TimeField(BaseTemporalField)    格式:11:12
    DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
     
    DurationField(Field)            时间间隔:%d %H:%M:%S.%f
        ...
     
    RegexField(CharField)
        regex,                      自定制正则表达式
        max_length=None,            最大长度
        min_length=None,            最小长度
        error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'}
     
    EmailField(CharField)      
        ...
     
    FileField(Field)
        allow_empty_file=False     是否允许空文件
     
    ImageField(FileField)      
        ...
        注:需要PIL模块,pip3 install Pillow
        以上两个字典使用时,需要注意两点:
            - form表单中 enctype="multipart/form-data"
            - view函数中 obj = MyForm(request.POST, request.FILES)
     
    URLField(Field)
        ...
     
     
    BooleanField(Field)  
        ...
     
    NullBooleanField(BooleanField)
        ...
     
    ChoiceField(Field)
        ...
        choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)
        required=True,             是否必填
        widget=None,               插件,默认select插件
        label=None,                Label内容
        initial=None,              初始值
        help_text='',              帮助提示
     
     
    ModelChoiceField(ChoiceField)
        ...                        django.forms.models.ModelChoiceField
        queryset,                  # 查询数据库中的数据
        empty_label="---------",   # 默认空显示内容
        to_field_name=None,        # HTML中value的值对应的字段
        limit_choices_to=None      # ModelForm中对queryset二次筛选
         
    ModelMultipleChoiceField(ModelChoiceField)
        ...                        django.forms.models.ModelMultipleChoiceField
     
     
         
    TypedChoiceField(ChoiceField)
        coerce = lambda val: val   对选中的值进行一次转换
        empty_value= ''            空值的默认值
     
    MultipleChoiceField(ChoiceField)
        ...
     
    TypedMultipleChoiceField(MultipleChoiceField)
        coerce = lambda val: val   对选中的每一个值进行一次转换
        empty_value= ''            空值的默认值
     
    ComboField(Field)
        fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式
                                   fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
     
    MultiValueField(Field)
        PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
     
    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']
     
    FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中
        path,                      文件夹路径
        match=None,                正则匹配
        recursive=False,           递归下面的文件夹
        allow_files=True,          允许文件
        allow_folders=False,       允许文件夹
        required=True,
        widget=None,
        label=None,
        initial=None,
        help_text=''
     
    GenericIPAddressField
        protocol='both',           both,ipv4,ipv6支持的IP格式
        unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
     
    SlugField(CharField)           数字,字母,下划线,减号(连字符)
        ...
     
    UUIDField(CharField)           uuid类型
  • 相关阅读:
    基础C语言知识串串香7☞位操作
    史上z..zui难回答的26个问题(1)
    基础C语言知识串串香6☞内存大话题
    基础C语言知识串串香5☞如何避免回绕和溢出
    基础C语言知识串串香4☞注意隐形提升带来的C陷阱
    基础C语言知识串串香3☞size_t类型
    基础C语言知识串串香1☞基本数据类型
    基础C语言知识串串香2☞char类型变量种种
    Linux
    Ubunt_配置_网易的源
  • 原文地址:https://www.cnblogs.com/wt7018/p/11297660.html
Copyright © 2020-2023  润新知