• Django form表单


    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类型
    
    Django Form内置字段
    Django Form 内置字段

    form组件的主要功能:

    • 生成页面可用的HTML标签
    • 对用户提交的数据进行校验
    • 将校验结果返回至HTML 并且可以保留上次输入内容

    使用form表单实现注册功能

    1、导入form  

    from django  import   forms
    

     2、定义一个form类

    class Regform(forms.Form):
        user = forms.CharField(max_length= 8,label='用户名')
        pwd = forms.CharField(min_length=6,label='密码')
    

    3、实例化form对象,传导模板语言中

    def reg(request):
        form_obj = Regform()
        return  render(request,'reg.html',{'form_obj':form_obj})
    

     4、在模板语言中调用form对象的响应方法和属性

    对得到的只做校验。将值写入到数据库

    form表单的常用字段和插件

    初始值initial  input框里HTML里边默认的显示的值

    class Regform(forms.Form):
        user = forms.CharField(max_length= 8,label='用户名',initial="小白")
        pwd = forms.CharField(min_length=6,label='密码')
    

     error_messages  重写错误信息

    class Regform(forms.Form):
        user = forms.CharField(
            min_length= 8,
            label='用户名',
             error_messages={
                "required": "不能为空",
                "invalid": "格式错误",
                "min_length": "用户名最短8位"
            }
        )
    
        pwd = forms.CharField(min_length=6,label='密码')
    

     password    

    from django.forms  import  widgets  #使用widgers插件生成HTML相关的设置
    from django  import   forms
    class Regform(forms.Form):
        user = forms.CharField(
            min_length= 8,
            label='用户名',
             error_messages={
                "required": "不能为空",
                "invalid": "格式错误",
                "min_length": "用户名最短8位"
            }
        )
        pwd = forms.CharField(
            min_length=6,
            label='密码',
            widget=widgets.PasswordInput(attrs={'class': 'c1'},render_value=True) #密码还是在输入框内
        )
    

     radioSelect   单选

    class Regform(forms.Form):
        user = forms.CharField(
            min_length=8,
            label='用户名',
            error_messages={
                "required": "不能为空",
                "invalid": "格式错误",
                "min_length": "用户名最短8位"
            }
        )
        pwd = forms.CharField(
            min_length=6,
            label='密码',
            widget=widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
        )
        gender = forms.fields.ChoiceField(
            choices=((1, "男"), (2, "女"), (3, "保密")),
            label="性别",
            initial=3,
            widget=forms.widgets.RadioSelect()
        )
    

     下拉框select的单选与多选

    class Regform(forms.Form):
        hobby = forms.ChoiceField(
            choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
            label="爱好",
            initial=3,
            widget=forms.widgets.Select()
        )
        hobby2 = forms.MultipleChoiceField(
            choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
            label="爱好",
            initial=[1, 3],
            widget=forms.widgets.SelectMultiple()
        )
    

     checkbox的单选与多选

    class Regform(forms.Form):
        hobby3 = forms.MultipleChoiceField(
            choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
            label="爱好",
            initial=[1, 3],
            widget=forms.widgets.CheckboxSelectMultiple()
        )
    
        keep = forms.ChoiceField(
            label="是否记住密码",
            initial="checked",
            widget=forms.widgets.CheckboxInput()
        )
    

     使用choice注意事项

    使用choice可以从数据库读取数据作为选项,并且自定义__init__方法,刷新后自动读取数据库数据

     class Regform(forms.Form):
        city=forms.ChoiceField(
            choices = models.City.objects.all().values_list('id','name'),
            label='来自哪里',
            initial=1,
            widget=forms.widgets.Select()
        )
        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            self.fields['city'].choices = models.City.objects.all().values_list('id','name')
    

     form表单实现注册登录验证

    views.py

    from django.shortcuts import render, HttpResponse
    from app01 import models
    from  django.core.validators import   RegexValidator
    from django.forms import widgets
    from django import forms
    class Regform(forms.Form):
        city=forms.ChoiceField(
            choices = models.City.objects.all().values_list('id','name'),
            label='来自哪里',
            initial=1,
            widget=forms.widgets.Select(attrs={'class': "btn btn-default dropdown-toggle"})
        )
        user = forms.CharField(
            max_length=8,
            label='用户名',
            error_messages={
                "max_length": "用户名最大8位",
                'required':"该字段不能为空"
    
            },
            widget=widgets.TextInput(attrs={'class': "form-control"})
    
        )
        pwd = forms.CharField(
            min_length=6,
            label='密码',
    
            error_messages={
                "min_length": "密码最少为6位",
                'required':"该字段不能为空"
            },
             widget=widgets.PasswordInput(attrs={'class': "form-control"}, render_value=True),
        )
        re_pwd = forms.CharField(
            min_length=6,
            label='确认密码',
    
            error_messages={
                "min_length": "密码最少为6位",
                'required':"该字段不能为空"
            },
            widget=widgets.PasswordInput(attrs={'class': "form-control"}, render_value=True),
        )
        email = forms.EmailField(
            label="电子邮箱",
            error_messages={
                'required':"该字段不能为空"
            },
            widget=widgets.EmailInput(attrs={'class': "form-control"}),
        )
        moboil = forms.CharField(
                label="手机号",
                validators=[
                RegexValidator(r'^[0-9]+$','手机号必须是数字'),
                RegexValidator(r'^1[3-9]\d{9}$','手机号不符合规范')
                    ],
                error_messages={
                    'required':"该字段不能为空"
                },
                widget=widgets.TextInput(attrs={'class': "form-control"})
            )
        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            self.fields['city'].choices = models.City.objects.all().values_list('id','name')
        def clean(self):
            pwd = self.cleaned_data.get('pwd')
            re_pwd = self.cleaned_data.get('re_ped')
            if pwd != re_pwd:
                self.add_error('re_pwd',ValueError('两次密码不一致'))
                #raise  ValueError('两次密码不一致')
            return self.cleaned_data
    
    def reg(request):
        choices = models.City.objects.all().values_list('id','name')
        print(choices)
        form_obj = Regform()
        if request.method == "POST":
            form_obj = Regform(request.POST)
            # if form_obj.is_valid():
            #     pass
            # form_obj.cleaned_data  # 得到的用户注册信息
            # models.Userinfo.objects.create(**form_obj.cleaned_data)  # 写入到数据库
            # return HttpResponse('注册成功')
        return render(request, 'reg.html', {'form_obj': form_obj})
    

     reg.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
    </head>
    <body>
    
    {#    <form action="/reg/" ,method="POST">#}
    {#        {{ form_obj.as_p }}#}
    {#        <p><input type="submit" value="提交"></p>#}
    {#    </form>#}
    <div class="container">
        {% csrf_token %}
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <form action="/reg/" method="POST" novalidate>
                      {%  csrf_token  %}
                    <div class="form-group {% if  form_obj.user.errors.0 %}has-error{% endif %} "  >
                        {{ form_obj.user.label }}
                        {{ form_obj.user }}
                        <span class="help-block" >{{ form_obj.user.errors.0 }}</span>
                    </div>
                    <div class="form-group  {% if  form_obj.pwd.errors.0 %}has-error{% endif %} " >
                        {{ form_obj.pwd.label }}
                        {{ form_obj.pwd }}
                        <span class="help-block ">{{ form_obj.pwd.errors.0 }}</span>
                    </div>
                    <div class="form-group {% if  form_obj.re_pwd.errors.0 %}has-error{% endif %}"  >
                        {{ form_obj.re_pwd.label }}
                        {{ form_obj.re_pwd }}
                        <span class="help-block">{{ form_obj.re_pwd.errors.0 }}</span>
                    </div>
                 <div class="form-group {% if  form_obj.email.errors.0 %}has-error{% endif %}"  >
                        {{ form_obj.email.label }}
                        {{ form_obj.email }}
                        <span class="help-block">{{ form_obj.email.errors.0 }}</span>
                    </div>
                <div class="form-group {% if  form_obj.moboil.errors.0 %}has-error{% endif %}"  >
                        {{ form_obj.moboil.label }}
                        {{ form_obj.moboil }}
                        <span class="help-block">{{ form_obj.moboil.errors.0 }}</span>
                    </div>
                <div class="form-group">
                        {{ form_obj.city.label }}
                        {{ form_obj.city }}
                    </div>
                    <div class="form-group">
                        <input type="submit" value="提交" class="btn btn-default">
                    </div>
                </form>
            </div>
        </div>
    </div>
    <script src="/static/jquery-3.3.1.min.js"></script>
    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
    </body>
    </html>
    

    I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    easyExcel入门
    UML-从需求到设计--迭代进化
    UML-操作契约总结
    102. Binary Tree Level Order Traversal
    98. Validate Binary Search Tree
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    84. Largest Rectangle in Histogram
    92. Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/weidaijie/p/9918221.html
Copyright © 2020-2023  润新知