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>

 

posted @ 2018-11-06 21:20  离人怎挽_wdj  阅读(106)  评论(0编辑  收藏  举报