[Django高級之forms部件]

[Django高級之forms部件]

forms部件之校检字段名

# 第一步:界定一个类,承继forms.Form
# 第二步:在类中写毛笔字段,要校检的字段名,字段名特性便是校检标准
# 第三步:创建对象获得一个Form目标,把要校检的数据信息传到
# 第四步:启用 目标.is_valid()校检,校检根据便是True
		能够分辨是不是合乎界定的字段名标准	
# 第五步:校检根据有 目标.cleaned_data   
	获得合乎校检标准的数据信息

# 第六步:校检不通过 目标.errors
	获得不符校检的字段名、及其错误报告
性前戏
	写一个注册网页获得客户的登录名和登陆密码
    发送至后端开发以后在后端开发进行对登录名和登陆密码的数据信息校检
    	1.登录名里边不可以带有JPZ
        2.登陆密码不可以为空
    将信息提示3D渲染到前面网页页面

1.前面网页页面标识撰写
2.前面网页页面信息内容展现
3.后端开发数据信息校检


forms部件能够一条龙服务 帮你进行上边的三件事儿
	1.3D渲染标识
    2.校检数据信息
    3.展现信息内容forms部件校检数据信息

1、目标 .is_valid()

2、目标 .cleaned_data

3、目标 .errors

# forms编码撰写

from django import forms

class MyForm(forms.Form):
    # username字段名至少不可以低于3位 数最多不可以超出8位
    username = forms.CharField(max_length=8,min_length=3)
    # password字段名最高值不可以超出699
    password = forms.IntegerField(max_value=699)
    # email字段名务必合乎邮箱格式
    email = forms.EmailField()
# 校检数据信息
from app01 import views
# 1.类加括弧 传到词典就可以
	form_obj = views.MyForm({'username':'jason','password':'123','email':'嘿嘿'})
# 2.分辨数据信息是不是合理合法(仅有所有合理合法結果才为True)
	form_obj.is_valid()
	False
# 3.查询全部合理合法的数据信息
	form_obj.cleaned_data
	{'username': 'jason', 'password': 123}
# 4.查询全部不合理合法的数据信息及缘故
	form_obj.errors
	{'email': ['Enter a valid email address.']}
"""
校检数据信息能够多传 可是不可以少传(默认设置选填)
"""

校检数据信息能够多传 可是不可以少传(默认设置选填)

forms部件3D渲染标识

def register(request):
    if request.method == 'GET':
        # GET要求沒有数据信息,必须转化成一个空form目标
        # 这一form跟下边没有关系,是get请求回来的获得一个空form
        register_form = RegisterFrom()
        # 传入前面网页页面后,根据form开展3D渲染
        return render(request, 'register.html', {'form': register_form})
    else:
        register_form = RegisterFrom(request.POST)

        if register_form.is_valid():
            print('验证根据')
            print(register_form.cleaned_data)
            register_form.cleaned_data.pop('re_password')
            models.User.objects.create(**register_form.cleaned_data)
        else:
            print('验证不通过')
            print(register_form.errors)

        return render(request,'register.html')

3D渲染方法一

扩展性强,可是必须撰写的编码过多,一般状况下无需

 <h2>根据form全自动3D渲染一</h2>
<form action="" method="post">
     <p>登录名 {{ form.name }}</p>   
     <p>登陆密码 {{ form.password }}</p>    
    <p>确定登陆密码 {{ form.re_password }}</p>    
    <p>电子邮箱 {{ form.email }}</p>    
<input type="submit" value="递交"></form>

3D渲染方法二

强烈推荐应用,编码撰写简易,而且扩展性强

<h2>根据form全自动3D渲染二(基本上用这类)</h2>

<form action="" method="post">
    {% for item in form %}
        <p>{{ item.label }}{{ item }}</p>                    
    {% endfor %}
<input type="submit" value="递交"><span style="color: red">{{ error }}</span>

</form>

3D渲染方法三

编码撰写非常少,封裝水平太高,不有利于事后的拓展,一般状况下只在当地检测应用

<h2>根据form全自动3D渲染三</h2>
<form action="" method="post">
    {{ form.as_p }}
    {#    {{ form.as_table }}#}
    {#    {{ form.as_ul }}#}

</form>

留意:#forms部件没法3D渲染提交按钮和form标识都想要你自身撰写

forms部件展现信息提示

后端开发编码撰写views.py

# 后端开发views中界定form类:

from django import forms
# forms编码撰写
class Myform(forms.Form):
    # 数最多8位 至少3位
    username = forms.CharField(max_length=8,min_length=3,label='登录名',
                               error_messages={  
                                   # 自定错误报告
                                   'max_length':'登录名数最多8位',
                                   'min_length':'登录名至少3位',
                                   'required':'登录名不可以为空',
                               },
                               widget=widgets.TextInput(attrs={'class':'form-control'}))
    						# 特定字段名种类				
        )
    # 数最多666位
    password = forms.IntegerField(max_value=666,label='登陆密码',
                                  error_messages={  
                                      # 自定错误报告
                                      'max_length': '登陆密码数最多8位',
                                      'min_length': '登陆密码至少3位',
                                      'required': '登陆密码不可以为空'
                                  },
                                   widget=widgets.PasswordInput(attrs={'class':'form-control'}))					# 特定字段名种类为 password
                                 )
    confirm_password = forms.IntegerField(max_value=666, label='确定登陆密码',
                                  error_messages={  
                                      # 自定错误报告
                                      'max_length': '确定登陆密码数最多8位',
                                      'min_length': '确定登陆密码至少3位',
                                      'required': '确定登陆密码不可以为空'
                                  })
    # 务必合乎邮箱格式
    email = forms.EmailField(label='电子邮箱',
                             error_messages={  # 自定错误报告
                                'invalid':'邮箱格式有误',
                                 'required': '电子邮箱不可以为空',
                             })
 --------------------------------------------------------------------
# views主视图涵数解决一部分:
    def login(request):
    # 1、老先生成一个目标
    form_obj = Myform()
    # 2、分辨要求方法
    if request.method == 'POST':
          # 获得客户数据信息
        # request.POST  # 能够立即当做是一个词典
        # 校检客户数据信息
        # MyForm()  # forms部件校检数据信息恰好必须传到一个词典
        '''以上二步合一步'''
        # 3、校检数据信息  于上边目标名称务必一致
        form_obj = Myform(request.POST)
        # 4、分辨数据信息是不是合理合法
        if form_obj.is_valid():
            # 5、合理合法得话
            return HttpResponse('登录成功')
	# 2.将该目标传送给html网页页面
    return render(request,'login.html',locals())

前端代码撰写login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/Twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<form action="" method="post" novalidate>
# 撤销电脑浏览器校检 novalidate
    {% for form in form_obj %}
        <p>{{ form.label }}:{{ form }}
        <span style="color: red">{{ form.errors.0 }}</span>
        </p>
    {% endfor %}

    <button class="btn btn-info">递交</button>



</form>
</body>
</html>

forms部件常见主要参数

class Ret(Form):
    name = forms.CharField(max_length=10, min_length=2, label='登录名',
                           error_messages={
                               'required': '该字段名不可以为空',
                               'invalid': '文件格式不正确', 
                               'max_length': '过长',
                               'min_length': '过短'},
                           widget=widgets.TextInput(attrs={'class':'form-control'}))


max_length			较大范畴
min_length			最少范畴
label				字段名文字內容
required			字段名是不是选填 默认设置是True
error_messages		 界定信息提示
widget				界定字段名种类和特性
validators			附加的校检作用(一般全是正则表达式)
initial			    设定初始值

除开上边二种方法,大家还能够在Form类中界定钩子函数,来完成自定的认证作用。

部分勾子:

我们在Fom类中界定 clean_字段名() 方式 ,就可以完成对特殊字段名开展校检。

全局钩子:

我们在Fom类中界定 clean() 方式 ,就可以完成对字段名开展全局性校检。

给予更为繁杂的与业务流程有关的校检作用
钩子函数实际上就在撰写forms类的全过程中定义方法

'''钩子函数全是在数据信息校检的最后一个阶段实行'''
--------------------------------------------------------------------------------------

部分勾子(单独字段名校检应用部分)

	# 校检当今登录名是不是已存有
    def clean_username(self):
        # 获得登录名
        username = self.cleaned_data.get('username')
        # 数据库查询并分辨
        if username == 'jason':
            # 提醒登录名已存有
            self.add_error('username','登录名已存有')
        return username

 -----------------------------------------------------------------------------------   
全局钩子(好几个字段名校检应用全局性)
	# 校检登陆密码与确定登陆密码是不是一致
    def clean(self):
        # 获得登陆密码 与 确定登陆密码
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if not password == confirm_password:
            self.add_error('confirm_password','2次登陆密码不一致')
        return self.cleaned_data

建立Form类时,关键牵涉到 【字段名】 和 【软件】,字段名用以对客户要求数据信息的认证,软件用以自动生成HTML;

initial

初值,input框里边的初值。

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="登录名",
        initial="张三"  # 设定初始值
    )
    pwd = forms.CharField(min_length=6, label="登陆密码")

error_messages

调用错误报告。

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

class LoginForm(forms.Form):
    ...
    pwd = forms.CharField(
        min_length=6,
        label="登陆密码",
        widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
    )

radioSelect

单radio数值字符串数组

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

class LoginForm(forms.Form):
    ...
    hobby = forms.ChoiceField(
        choices=((1, "篮球赛"), (2, "足球队"), (3, "福彩双色球"), ),
        label="喜好",
        initial=3,
        widget=forms.widgets.Select()
    )

多选题Select

class LoginForm(forms.Form):
    ...
    hobby = forms.MultipleChoiceField(
        choices=((1, "篮球赛"), (2, "足球队"), (3, "福彩双色球"), ),
        label="喜好",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
    )

单项选择题checkbox

class LoginForm(forms.Form):
    ...
    keep = forms.ChoiceField(
        label="是不是密码登录",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
    )

多选题checkbox

class LoginForm(forms.Form):
    ...
    hobby = forms.MultipleChoiceField(
        choices=((1, "篮球赛"), (2, "足球队"), (3, "福彩双色球"),),
        label="喜好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
    )

RegexValidator认证器

from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
class MyForm(Form):
    user = fields.CharField(
        validators=[RegexValidator(r'^[0-9] $', '输入您数据'), RegexValidator(r'^159[0-9] $', '数据务必以159开始')],
    )

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')

方法二:

from django import forms
from django.forms import fields
from 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())  # 单项选择题


评论(0条)

刀客源码 游客评论