Python菜鸟之路:Django 表单验证

前言

  Django中完成表单验证,常用的有两种方法:

  一种是通过HTML + JS + Ajax实现。

  另一种是通过Django自身的forms模块来生成相应个HTML标签来完成表单验证。这是本节着重讲的地方

第一种方法:html + ajax实现基本的login页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        .error-msg{
            color: red;
        }
    </style>
</head>
<body>
    <div>
        <div>
            <input type="text" name="user" />

        </div>
        <div>
            <input type="password" name="pwd" />
        </div>
        <div>
            <input type="text" name="num" />
        </div>
        <div>
            <input type="text" name="phone" />
        </div>
        <input type="button" value="提交" onclick="DoSubmit();" />
    </div>
    <script src="/static/jquery-2.1.4.min.js"></script>
    <script>
        function DoSubmit(){
            var input_dict = {};
            $(‘input‘).each(function(){
                var v = $(this).val();
                var n = $(this).attr(‘name‘);
                input_dict[n] = v;
            });
            console.log(input_dict);
            $(‘.error-msg‘).remove();
            $.ajax({
                url: ‘/login/‘,
                type: ‘POST‘,
                data: input_dict,
                dataType: ‘json‘,
                success: function (result) {
                    if(result.status){
                        location.href = ‘/index/‘;
                    }else{

                        $.each(result.message, function (k,v) {
                            console.log(k,v[0].message);
                            // <span class="error-msg">错误信息</span>
                            var tag = document.createElement(‘span‘);
                            tag.className = ‘error-msg‘;
                            tag.innerText = v[0].message;
                            // input[name="user"]
                            $(‘input[name="‘ + k + ‘"]‘).after(tag);
                        })
                    }
                },
                error: function () {

                }
            })
        }
    </script>
</body>
</html>

HTML代码

from django.shortcuts import render,HttpResponse

# Create your views here.
from django import forms
from django.core.exceptions import ValidationError
import re

def mobile_validate(value):
    mobile_re = re.compile(r‘^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$‘)
    if not mobile_re.match(value):
        raise ValidationError(‘手机号码格式错误‘)

class LoginForm(forms.Form):
    user = forms.CharField(required=True, error_messages={‘required‘: ‘用户名不能为空.‘})
    pwd = forms.CharField(required=True,
                          min_length=6,
                          max_length=10,
                          error_messages={‘required‘: ‘密码不能为空.‘, ‘min_length‘: "至少6位"})
    num = forms.IntegerField(error_messages={‘required‘: ‘数字不能空.‘,‘invalid‘: ‘必须输入数字‘})
    phone = forms.CharField(validators=[mobile_validate, ],)

import json
def login(request):
    if request.method == ‘POST‘:
        result = {‘status‘: False, ‘message‘: None}
        obj = LoginForm(request.POST)
        ret = obj.is_valid()
        if ret:
            print(obj.clean())
            result[‘status‘] = True
        else:
            from django.forms.utils import ErrorDict
            #print(type(obj.errors),obj.errors.as_json())
            error_str = obj.errors.as_json()
            result[‘message‘] = json.loads(error_str)
        return HttpResponse(json.dumps(result))
    return render(request, ‘login.html‘)

views代码

  这里边views中,已经用到了django自带的forms模块。在不用这个模块之前,我们对于用户输入进行判断,需要一堆的if..if...if语句来进行,但是用了这个模块之后,仅需要在定义好LoginForm类中每个字段的属性后,通过obj = LoginForm(request.POST)和ret = obj.is_valid()两步,就可以完成对于用户输入信息的验证。ret会返回验证是否全部通过。全部通过则为True,只要有一条表单信息验证不通过,则为False。

这里需要关注的知识点是:obj.clean() 是输出用户post的正确信息,是一个dict,obj.errors是输出用户post的错误信息,是一个通过ul li显示的信息,这样不方便查看。可以通过obj.errors.as_json()来将错误信息以json形式展示,用error_str = obj.errors.as_json() 和 result[‘message‘] = json.loads(error_str)来完成错误信息收集。

  另外定义表单验证规则LoginForm类时,字段名需要等于html中name值

  补充知识点:在定义的LoginForm中,定义的pwd字段是这样定义的

pwd = forms.CharField(required=True,
                          min_length=6,
                          max_length=10,
                          error_messages={‘required‘: ‘密码不能为空.‘, ‘min_length‘: "至少6位"})

  其中error_messages属性是用来定义错误信息的展示的。解释为:如果required验证不通过,则提示‘密码不能为空‘,min_length验证不通过,则错误信息为‘至少6位‘。扩展‘invalid‘: ‘必须输入数字‘

第二种方法:利用forms模块生成html标签

  forms能解决的2个问题:

  问题1: 如果使用html自带的form标签来进行提交,如果提交的数据有错误,会清空表单中的全部数据,如果表单项较多,对用户非常不友好。那么forms模块就能解决这个问题。

问题2: 使用html的form标签提交数据,需要input标签的name属性必须和定义的class类的属性一致。而使用django forms模块,则不需要考虑这个问题。

时间: 2024-12-15 06:22:56

Python菜鸟之路:Django 表单验证的相关文章

17.Django表单验证

Django提供了3中方式来验证表单 官网文档:https://docs.djangoproject.com/en/1.9/ref/validators 1.表单字段验证器 a.引入:from django.core.exceptions import ValidationError b.定义验证方法,验证不通过抛一个ValidationError异常 def validate_name(value): 验证不通过 raise ValidationError("%s的信息已经存在"%v

django表单验证和跨站伪造csrf

Form验证 django中的Form一般有两种功能: 输入html 验证用户输入 django使用内置form方法验证表单提交的数据 html页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .error-msg { color: red; } <

python_way day14 HTML-day5 (form表单验证,)

python-way day19 1. dJango的form表单验证 一,django表单验证功能 1.django验证基础: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>django form</title> </head> <body> <div> <i

python+django实现的简单的表单验证源码

下面的内容段是关于python+django实现的简单的表单验证的内容,应该能对大伙也有用途. <html> <head> <title>Form validation example</title> <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/bootstrap.css"> </head>

Python自动化运维系列之Django Form表单验证

Form表单验证 Django核心功能组件之一,虽然也可以在前端使用JS对表单验证, 但是Django中已经为我们准备好的Form功能还算是很强大的,有时候比较适合运维,为我们简化了很多前端开发工作. Django最主要的几个功能有4个     ·  生成HTML标签     ·  验证数据(表单错误信息提示)     ·  HTML 表单保留上次提交数据     ·  初始化页面表单内容 Django的Form内容还是挺多的,我们可以从一个简单的登陆验证例子来看看Form的基本功能使用 1)新

7Python全栈之路系列之Django表单

Python全栈之路系列之Django表单 从Request对象中获取数据 HttpRequest对象包含当前请求URL的一些信息: 熟悉/方法 描述 例如 request.path 除域名以外的请求路径 /hello/ request.get_host() 访问的域名 127.0.0.1:8000" or www.example.com request.get_full_path() 请求路径,可能包含查询字符串 /hello/?print=true request.is_secure() 是

django之form表单验证

django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf-8 -*- import re from django import forms from django.core.exceptions import ValidationError def mobile_validate(value): mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]

Python菜鸟之路:Django 路由补充FBV和CBV

在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view . 今天补充另外一种路由关系的写法:CBV,即:class base view , 也可以看做为面向资源编程的另外一种叫法,类似tornado中的路由写法. 1. 建立路由关系urls.py from app01 import views urlpatterns = [ url(r'^home/', views.Hom

Django基础之Form表单验证

Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from django.forms import widgets from Mybbs.models import * import re class UserForm(Form): username = fields.CharField( required=True, error_messages={'re