请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

forms组件

[复制链接]
查看: 80|回复: 0

1万

主题

2万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
47993
发表于 2019-12-4 01:21 | 显示全部楼层 |阅读模式
[TOC]
forms组件

先抛出一个需求:
  1. 1.写一个注册功用,获得用户输入的用户名和密码,提交到后端,后端做校验2.用户名里面不能含有敏感信息,给出响应的提醒3.假如密码小于三位,就提醒用户
复制代码
手动钞缮需求

views.py
  1. def register(request):    errors = {'username':'', 'password':''}    if request.method == 'POST':        username = request.POST.get('username')        password = request.POST.get('password')        if 'zf' in username:            errors['username'] = '不能操纵该字符'        if len(password) < 4:            errors['password'] = '密码不能小于三位'    return render(request, 'register.html', locals())
复制代码
register.html
  1.             username:        {{ errors.username }}   
  2.             password:        {{ errors.password }}   
  3.    
复制代码
forms组件  游戏 picgo-img20191203165339

这里实现了三个功用:

  • 手写html页面获得用户输入信息
  • 将数据传入后端做数据校验
  • 倘使有毛病,展现毛病信息
可是这个页面手写麻烦,输入信息写错了,一革新信息全没了,很反面睦!!
操纵forms组件校验数据

操纵forms组件首先要导入forms模块, 写这玩意类似于models
  1. from django import formsclass MyForm(forms.Form):    # username字段 最多八位, 最少三位    username = forms.CharField(max_length=8, min_length=3)    # password字段 最多八位, 最少三位    password = forms.CharField(max_length=8, min_length=3)    # email字段  必须是邮箱格式    email = forms.EmailField()
复制代码
然后对数据举行校验, 可以写一个测试剧本,还可以操纵pycharm左下角的Python Console功用,会自动搭建测试剧本
forms组件  游戏 picgo-img20191203165759

操纵测试
forms组件  游戏 picgo-img20191203170129

forms组件  游戏 picgo-img20191203170635

校验数据的方式:

  • 给写好的类 传字典数据(待校验的数据)
    form_obj = views.MyForm({'username':'cwz','password':'12','email':'123'})
  • 怎样检察校验的数据能否正当
    form_obj.is_valid()  只要全数数据合适校验法则才为True
  • 怎样检察不合适法则的字段及毛病的出处
    form_obj.errors
  • 怎样检察合适校验法则的数据
    form_obj.cleaned_data
  • forms组件中 界说的字段默许都是必须传值的  不能少传
  • forms组件只会校验forms类中界说的字段  假如你多传了 不会有任何影响
forms组件  游戏 picgo-img20191203171653

forms组件  游戏 picgo-img20191203171200

forms组件衬着标签

1. 方式一

forms组件只会帮你衬着用户输入的标签,不会帮衬着提交按钮标签。
views.py
  1. def index(request):    # 衬着标签,天赋生一个空的form类的工具    form_obj = MyForm()    return render(request, 'index.html', locals())
复制代码
前端页面:
  1. forms组件衬着的方式1
  2. {{ form_obj.as_p }}
  3. {{ form_obj.as_ul }}
  4. {{ form_obj.as_table }}
复制代码
结果:
forms组件  游戏 picgo-img20191203172608

总结:这类衬着标签的方式封装水平态高    不举荐操纵    可是可以用在当地测试
2. 方式二

不举荐操纵,比力麻烦
  1. forms组件衬着标签方式2:
  2. {{ form_obj.username.label }}{{ form_obj.username }}{{ form_obj.password.label }}{{ form_obj.password }}{{ form_obj.email.label }}{{ form_obj.email }}
复制代码
3.方式三
  1. forms组件衬着标签方式3:
  2. {% for form in form_obj %}    {{ form.label }} {{ form }}
  3. {% endfor %}
复制代码
forms组件  游戏 picgo-img20191203183703

若想要label标签表示中文,可以指定label标签:
  1. from django import formsclass MyForm(forms.Form):    # username字段 最多八位, 最少三位    username = forms.CharField(max_length=8, min_length=3, label='用户名')    # password字段 最多八位, 最少三位    password = forms.CharField(max_length=8, min_length=3, label='密码')    # email字段  必须是邮箱格式    email = forms.EmailField(label='邮箱')
复制代码
forms组件展现信息
  1.     {% for form in form_obj %}        {{ form.label }} {{ form }}
  2.     {% endfor %}   
复制代码
views.py
  1. from django import formsclass MyForm(forms.Form):    # username字段 最多八位, 最少三位    username = forms.CharField(max_length=8, min_length=3, label='用户名')    # password字段 最多八位, 最少三位    password = forms.CharField(max_length=8, min_length=3, label='密码')    # email字段  必须是邮箱格式    email = forms.EmailField(label='邮箱')def index(request):    # 衬着标签,天赋生一个空的forms类的工具    form_obj = MyForm()    if request.method == 'POST':        form_obj = MyForm(request.POST)        if form_obj.is_valid():            print(form_obj.cleaned_data)            return HttpResponse('数据切确')        else:            print(form_obj.errors)    return render(request, 'index.html', locals())
复制代码
forms组件  游戏 picgo-img20191203185311

这玩意是前端做的校验
留意:
数据的校验凡是前后端都有,可是前真个校验不胜一击,无关紧急;后真个校验必必要有而且必须很是周全
在前端form表单加上一个参数(novalidate),便可以不做校验:
前端毛病信息展现写法:
  1.     {% for form in form_obj %}        {{ form.label }} {{ form }}            {{ form.errors.0 }}        
  2.     {% endfor %}   
复制代码
forms组件  游戏 picgo-img20191203190459

也支持中文表示信息
  1. from django import formsclass MyForm(forms.Form):    # username字段 最多八位, 最少三位    username = forms.CharField(max_length=8, min_length=3, label='用户名', error_messages={        'max_length': '用户名最长八位',        'min_length': '用户名最短三位',        'required': '用户名不能为空',    })    # password字段 最多八位, 最少三位    password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={        'max_length': '密码最长八位',        'min_length': '密码最短三位',        'required': '密码不能为空',    })    # email字段  必须是邮箱格式    email = forms.EmailField(label='邮箱', error_messages={        'required': '邮箱不能为空',        'invalid': '邮箱格式不切确'    })
复制代码
form组件自界说校验

RegexValidator考证器
  1. from django import formsfrom django.core.validators import RegexValidatorclass MyForm(forms.Form):    # username字段 最多八位, 最少三位    username = forms.CharField(max_length=8, min_length=3, label='用户名', error_messages={        'max_length': '用户名最长八位',        'min_length': '用户名最短三位',        'required': '用户名不能为空',    })    # password字段 最多八位, 最少三位    password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={        'max_length': '密码最长八位',        'min_length': '密码最短三位',        'required': '密码不能为空',    }, validators=[        RegexValidator(r'^[0-9]+$', '请输入数字'),        RegexValidator(r'^139[0-9]+$', '数字必必要以139开首')   # 可以增加多个正则表达式,从上往下校验    ]    )
复制代码
钩子函数  (HOOK)

当你以为上面的全数校验照旧不能满足需求,可以考虑钩子函数
全局钩子

我们在Fom类中界说 clean() 方式,便可以大要实现对字段举行全局校验。
  1. class MyForm(forms.Form):    # username字段 最多八位, 最少三位    username = forms.CharField(max_length=8, min_length=3, label='用户名', error_messages={        'max_length': '用户名最长八位',        'min_length': '用户名最短三位',        'required': '用户名不能为空',    })    # password字段 最多八位, 最少三位    password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={        'max_length': '密码最长八位',        'min_length': '密码最短三位',        'required': '密码不能为空',    })    re_password = forms.CharField(max_length=8, min_length=3, label='确认密码', error_messages={        'max_length': '确认密码最长八位',        'min_length': '确认密码最短三位',        'required': '确认密码不能为空',    })    # 校验密码 确认密码能否同等    def clean(self):        password = self.cleaned_data.get('password')        re_password = self.cleaned_data.get('password')        if not password == re_password:            self.add_error('re_password', '两次,密码分歧等')        return self.cleaned_data
复制代码
部分钩子

我们在Fom类中界说 clean_字段名() 方式,便可以大要实现对特定字段举行校验。
  1. class MyForm(forms.Form):    # username字段 最多八位, 最少三位    username = forms.CharField(max_length=8, min_length=3, label='用户名', error_messages={        'max_length': '用户名最长八位',        'min_length': '用户名最短三位',        'required': '用户名不能为空',    })    # password字段 最多八位, 最少三位    password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={        'max_length': '密码最长八位',        'min_length': '密码最短三位',        'required': '密码不能为空',    })    re_password = forms.CharField(max_length=8, min_length=3, label='确认密码', error_messages={        'max_length': '确认密码最长八位',        'min_length': '确认密码最短三位',        'required': '确认密码不能为空',    })    # 校验用户名中不能有666    def clean_username(self):        username = self.cleaned_data.get('username')        if '666' in username:            # 给username字段增加毛病信息            self.add_error('username', '666是不存在的')        # 将username返回进来        return username
复制代码
forms组件补充常识点

其他字段参数

label   input对应的提醒信息
initial   默许值
required    默以为True  控制字段能否必填
  1. class MyForm(forms.Form):    # username字段 最多八位, 最少三位    username = forms.CharField(max_length=8, min_length=3, label='用户名', initial='默许值',         error_messages={        'max_length': '用户名最长八位',        'min_length': '用户名最短三位',        'required': '用户名不能为空',                        }, required=False)
复制代码
widget 给input框设备款式及属性
  1. password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={        'max_length': '密码最长八位',        'min_length': '密码最短三位',        'required': '密码不能为空',    }, widget=forms.widgets.PasswordInput()  # 这个password字段是密文的
复制代码
  1. username = forms.CharField(max_length=8, min_length=3, label='用户名', initial='默许值',                               error_messages={                                   'max_length': '用户名最长八位',                                   'min_length': '用户名最短三位',                                   'required': '用户名不能为空',                               }, required=False,                               widget=forms.widgets.TextInput({'class': 'form-control c1 c2', 'username': 'cwz'})                               )
复制代码
error_messages

重写毛病信息。
  1. class LoginForm(forms.Form):    username = forms.CharField(        min_length=8,        label="用户名",        initial="张三",        error_messages={            "required": "不能为空",            "invalid": "格式毛病",            "min_length": "用户名最短8位"        }    )    pwd = forms.CharField(min_length=6, label="密码")
复制代码
password
  1. class LoginForm(forms.Form):    ...    pwd = forms.CharField(        min_length=6,        label="密码",        widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)    )
复制代码
radioSelect

单radio值为字符串
  1. class LoginForm(forms.Form):    username = forms.CharField(        min_length=8,        label="用户名",        initial="张三",        error_messages={            "required": "不能为空",            "invalid": "格式毛病",            "min_length": "用户名最短8位"        }    )    pwd = forms.CharField(min_length=6, label="密码")    gender = forms.fields.ChoiceField(        choices=((1, "男"), (2, "女"), (3, "保密")),        label="性别",        initial=3,        widget=forms.widgets.RadioSelect()    )
复制代码
单选Select
  1. class LoginForm(forms.Form):    ...    hobby = forms.ChoiceField(        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),        label="爱好",        initial=3,        widget=forms.widgets.Select()    )
复制代码
多选Select
  1. class LoginForm(forms.Form):    ...    hobby = forms.MultipleChoiceField(        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),        label="爱好",        initial=[1, 3],        widget=forms.widgets.SelectMultiple()    )
复制代码
单选checkbox
  1. class LoginForm(forms.Form):    ...    keep = forms.ChoiceField(        label="能否记着密码",        initial="checked",        widget=forms.widgets.CheckboxInput()    )
复制代码
多选checkbox
  1. class LoginForm(forms.Form):    ...    hobby = forms.MultipleChoiceField(        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),        label="爱好",        initial=[1, 3],        widget=forms.widgets.CheckboxSelectMultiple()    )
复制代码
choice字段留意事项

在操纵挑选标签时,必要留意choices的选项可以设备从数据库中获得,可是由因而静态字段 获得的值没法实时更新,必要重写机关方式从而实现choice实时更新
方式一
  1. from django.forms import Formfrom django.forms import widgetsfrom 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')
复制代码
方式二
  1. from django import formsfrom django.forms import fieldsfrom django.forms import models as form_model class FInfo(forms.Form):    authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())  # 多选    # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())  # 单选
复制代码
免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表