博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 之 Form组件
阅读量:6309 次
发布时间:2019-06-22

本文共 5580 字,大约阅读时间需要 18 分钟。

普通方式手写注册功能

def reg(request):    errors = {
'username':'','password':''} if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if 'sb' in username: errors['username'] = '用户名不能有sb' if password.isdigit(): errors['password'] = '不能为纯数字' return render(request,'login.html',locals())
后端
    
Title

username {

{ errors.username }}

password {

{ errors.password }}

前端

用form组件实现注册功能

django form组件

        1.渲染标签
        2.校验数据
        3.展示信息

渲染标签

第一步先定义一个Form类

 

第二步实例化form对象

               form_obj = MyForm({'name':'jason'})

from app01 import viewsform_obj = views.MyForm({
'name':'asd','password':'a654','email':3215})form_obj.is_valid()Falseform_obj.errors{
'email': ['Enter a valid email address.']}
form_obj.is_valid()与form_obj.errors
  • form_obj.is_valid()     可以判断RegForm实例化传值对不对,返回True,False
  • form_obj.errors          返回所有校验未通过的字段及错误提示
  • form_obj.cleaned_data        返回的是符合校验规则数据,存的是字典

 

注意:实例化时,如果传值传多了不影响,不会去校验这个多出来的值,会当它不存在,如果少传了值,form_obj.is_valid()就会是false,form_obj.errors报错{'email': ['This field is required.']},这个时候我们可以在字段后面设置required=False,这样就不用传值了

 

第三步查看数据校验是否合法

              form_obj.is_valid()  # 只有当所有的字段都校验通过才会返回True            

第四步查看校验错误的信息

                form_obj.errors  # 这个里面放的是所有校验未通过的字段及错误提示

                """
                {
                'name': ['Ensure this value has at most 6 characters (it has 7).'],
                'password': ['Ensure this value has at least 3 characters (it has 2).'],
                'email': ['Enter a valid email address.']
                }
                """

第五步查看校验通过的数据

                form_obj.cleaned_data  # 符合校验规则数据都会被放到该对象中

                ps:form组件校验数据的规则从上往下依次取值校验
                校验通过的放到cleaned_data
                校验失败的放到errors

 

渲染标签

            form组件只帮你渲染获取用户输入的标签,不会帮你渲染提交按钮,需要手动添加

第一种渲染方式(可扩展性较差)

            {

{ form_obj.as_p }}
            {
{ form_obj.as_ul }}

                        

第二种渲染方式

            <form action="">

                <p>{
{ form_obj.name.label }}{
{ form_obj.name }}</p>
                <p>{
{ form_obj.password.label }}{
{ form_obj.password }}</p>
                <p>{
{ form_obj.email.label }}{
{ form_obj.email }}</p>
                <input type="submit">
            </form>
            

输入框前面的提示词默认是字段名的首字母大写,我们可以通过添加label=""来修改

 

第三种渲染标签的方式

                <form action="">

                    {% for foo in form_obj %}
                        <p>{
{ foo.label }}{
{ foo }}</p>
                    {% endfor %}
                </form>

 

前端取消校验

            <form action="" method="post" novalidate>
            </form>

 

 form综合使用

后端

from django import formsclass MyForm(forms.Form):    name = forms.CharField(max_length=6,label='用户名',error_messages={        'max_length':'用户名最长不超过6位',        'required': '用户名不能为空'    }) #error_messages={}自定义错误提示,label='用户名',修改输入框前面的默认Name,Password    password = forms.CharField(max_length=6,min_length=3,error_messages={        'max_length':'密码最长不超过6位',        'min_length':'密码至少3位',        'required': '密码不能为空'    })    email = forms.EmailField(error_messages={        'invalid':'邮箱格式不正确',        'required': '邮箱不能为空'    })def reg(request):    # 先生成一个空对象    form_obj = MyForm()    if request.method == 'POST':        print(request.POST)        form_obj = MyForm(request.POST)        if form_obj.is_valid():            models.User.objects.create(**form_obj.cleaned_data)    return render(request, 'reg.html', locals())
error_messages={}自定义错误提示, label='用户名',修改输入框前面的默认Name,Password

前端

    
Title

第三种渲染方式

{
% for foo in form_obj %}

{

{ foo.label }}{
{ foo }} {
{ foo.errors.0 }}

{
% endfor %}

效果展示

 

钩子函数

局部钩子函数  (单个字段的校验利用局部钩子函数)  

class MyForm(forms.Form):    name = forms.CharField(max_length=6,label='用户名',error_messages={        'max_length':'用户名最长不超过6位',        'required': '用户名不能为空'    })    password = forms.CharField(max_length=6,min_length=3,error_messages={        'max_length':'密码最长不超过6位',        'min_length':'密码至少3位',        'required': '密码不能为空'    })    confirm_password = forms.CharField(max_length=6, min_length=3, error_messages={        'max_length': '确认密码最长不超过6位',        'min_length': '确认密码至少3位',        'required': '确认密码不能为空'    })    email = forms.EmailField(error_messages={        'invalid':'邮箱格式不正确',        'required': '邮箱不能为空'    })    def clean_name(self):        name = self.cleaned_data.get('name')        if 'sb' in name:            self.add_error('name','说脏话是不好地。。')        return name
局部钩子

全局钩子函数  (多个字段的校验利用全局钩子函数)

def clean(self):        password = self.cleaned_data.get('password')        confirm_password = self.cleaned_data.get('confirm_password')        if password != confirm_password:            self.add_error('confirm_password','两次密码不一致')        return self.cleaned_data
全局钩子

效果展示

 

设置标签样式     

from django import forms        from django.forms import widgets        password = forms.CharField(max_length=8,min_length=3,error_messages={                            'max_length': '密码最长8位',                            'required': '密码不能为空',                            'min_length':'密码最少3位'                            },widget=widgets.PasswordInput(attrs={
'class':'c1 form-control'})) #widget=widgets.PasswordInput设置密码密文,(attrs={'class':'c1 form-control'})设置样式 hobby = forms.ChoiceField( choices=((1, "篮球"), (2, "足球"), (3, "双色球"),), label="爱好", initial=3,#设置默认值 widget=forms.widgets.Select() ) hobby1 = forms.MultipleChoiceField( choices=((1, "篮球"), (2, "足球"), (3, "双色球"),), label="爱好", initial=[1, 3], widget=forms.widgets.SelectMultiple() ) keep = forms.ChoiceField( label="是否记住密码", initial="checked", widget=forms.widgets.CheckboxInput() )

 

   

 

转载于:https://www.cnblogs.com/tuanzibuku/p/11042715.html

你可能感兴趣的文章
oracle的nvl()函数的用法
查看>>
宏定义函数的易错点
查看>>
洛谷【P2458】[SDOI2006]保安站岗 题解 树上DP
查看>>
Shredding Company 碎纸机,dfs()枚举每一种情况,再加剪枝。
查看>>
命名空间和模块化编程 - C++快速入门39
查看>>
结构化程序设计03 - 零基础入门学习Delphi12
查看>>
今天才知道怎么插入代码!!!!!!!!!
查看>>
D2007在64位Win7出现 delphi 2007 assertion failure thread32.cpp 的解决办法
查看>>
STM32的TAMPER-RTC管脚作为Tamper的使用[转]
查看>>
[记]一个逐步“优化”的范例程序
查看>>
2012-01-09_2
查看>>
Visual Studio 2015 开发MVC4出现错误
查看>>
MongoDB 学习笔记之 批处理
查看>>
orcale 之 存储过程
查看>>
A程序是B程序的输入
查看>>
java基础数组(带基础排序法)
查看>>
[20180316]理解db file parallel read等待事件.txt
查看>>
文件系统02 - 零基础入门学习Delphi35
查看>>
8.转型
查看>>
php类中调用array_walk()函数
查看>>