Django表单类与校验

Django表单类与校验

​ 表单功能在开发的过程当中有一半的需求是获取数据,另一半校验数据。针对于表单,校验分为前端校验和后端校验:

​ 前端校验:就是通过js或者jq脚本对form表单输入的数据进行校验,形象,直观,有利于对用户进行提醒,用户体验好。

后端校验:就是在视图当中或者python后端当中对提交的数据进行校验,比较安全。

前端校验我们可以通过各种校验框架进行校验,django推出了自己的form表单类来定义后端校验。

表单类

​ Form表单类是有django定义的,可以自动生成前端form表单代码的表单类,已经完成大部分的校验功能。常用的form表单样式:as_P,as_ul,{% for %}

Django 的form表单没有携带form外标签,也没有提交按钮,这样的设计更方便开发者修改样式

Form表单类通用的参数:

Max_length最大长度
Min_length最小长度
required为False为可以为空,默认为True
labelForm表单的标签内容
Help_text帮助文档
在app中创建一个forms.py文件
from django import forms

class UserForm(forms.Form):
    # required 不可为空,默认为True
    # label = '用户名', 表格前的字段名
    # help_text = "填写6-8位字母数字" 提示
    username = forms.CharField(label='用户名',help_text="填写6-8位字母数字")
    password = forms.CharField(label='密码',widget=forms.PasswordInput)
    age = forms.IntegerField(label='年龄')
    email = forms.EmailField(label='邮箱')
    birthday = forms.DateField(label='生日')
视图
def djangoForm(request):

    userForm = UserForm()
    return render(request,'djangoForm.html',locals())

页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <p>基础的userForm</p>
        <br>
        <p>{{ userForm }}</p>
    </div>
    <p>++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++</p>

    <div>
        <p>p标签格式的userForm</p>
        <br>
        <p>{{ userForm.as_p }}</p>
    </div>
    <p>++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++</p>

    <div>
        <p>ul li格式的userForm</p>
        <br>
        <p>{{ userForm.as_ul }}</p>
    </div>
    <p>++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++</p>
    <div>
        <p>循环自定义的userForm----post请求</p>
        <br>
        <form class="register_form" method="post">
        {% csrf_token %}
        <table>
             {% for uf in userForm %}
                <tr>
                    <th>{{ uf.label }}</th>
                    <td>{{ uf }}</td>
                    <td>{{ uf.help_text }}</td>
                </tr>
            {% endfor %}
            <tr>
                <th colspan="2">
                    <input type="submit" value="提交">
                </th>

            </tr>

        </table>
        </form>
    </div>
   <p>++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++</p>
    <div>
        <p>循环自定义的userForm----git请求</p>
        <br>
        <form class="register_form" >
        <table>
             {% for uf in userForm %}
                <tr>
                    <th>{{ uf.label }}</th>
                    <td>{{ uf }}</td>
                    <td>{{ uf.help_text }}</td>
                </tr>
            {% endfor %}
            <tr>
                <th colspan="2">
                    <input type="submit" value="提交">
                </th>

            </tr>

        </table>
        </form>
    </div>

</body>
</html>

校验

首先创建一个表格,并同步数据库。

在forms.py中添加需要校验的内容

from django import forms
from django.forms import ValidationError
class UserForm(forms.Form):
    # required 不可为空,默认为True
    # label = '用户名', 表格前的字段名
    # help_text = "填写6-8位字母数字" 提示
    username = forms.CharField(label='用户名',
                               help_text="填写6-8位字母数字")
    password = forms.CharField(label='密码',widget=forms.PasswordInput)
    age = forms.IntegerField(label='年龄')
    email = forms.EmailField(label='邮箱')
    birthday = forms.DateField(label='生日')

    def clean_username(self):
        '''
        所有自定义的校验方法一定是clean_校验的字段名
        :return:
        '''
        username = self.cleaned_data.get('username')
        if 'GM' in username:
            raise ValidationError("昵称违规")
        else:
            return username
视图

对表单上返回的数据进行请求,然后传递给forms.py进行判断,如果校验通过,则保存到数据库,否则,返回错误。

def registerForm(request):
    userForm = UserForm() #实例化form表单,用于前端渲染
    error = ""
    if request.method == "POST":
        data = UserForm(request.POST) #将post请求的数据传递给UserForm进行校验
        if data.is_valid():#如果校验成功,返回true
            clean_data = data.cleaned_data #返回一个放着校验过的数据的字典
            user = UserModel()
            user.username = clean_data.get("username")
            user.password = clean_data.get("password")
            user.age = clean_data.get("age")
            user.email = clean_data.get("email")
            user.birthday = clean_data.get("birthday")
            user.save()
        else:
            error = data.errors
    return render(request,"register_user.html",locals())

页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        li{
            list-style: none;
        }
        *{
            font-size: 20px;
        }
        .errorlist{
            color: red;
            font-size: 18px;
        }

    </style>
</head>
<body>
    <form method="post" class="register_form">

    {% csrf_token %}
        {% for u in userForm %}
            <p>
                <label>{{ u.label }}</label>
                {{ u }}
            </p>
        {% endfor %}

        <p>
            <input type="submit" value="提交">
        </p>
    </form>
    {{ error }}
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值