Django实现表单验证

Django是一款成熟的web开发框架,其内置了表单验证机制,方便我们实现表单数据的验证。下面就来详细讲解Django实现表单验证的完整攻略。

1. 创建表单类

首先,我们需要创建一个表单类,在models.py中定义表单字段,例如:

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(max_length=20)
    password = forms.CharField(max_length=20)

在这个表单类中,我们定义了两个字段,一个是username用来接收用户名;一个是password用来接收密码。可以看到,我们使用Django提供的CharField来定义这两个字段,并设置了最大长度为20。

2. 渲染表单

接下来,在views.py中,我们需要将表单类实例化,并将实例化后的表单对象传入到login.html中渲染:

from django.shortcuts import render
from .forms import LoginForm

def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            # do something
            pass
    else:
        form = LoginForm()
    return render(request, 'login.html', {'form': form})

在这个视图函数中,我们首先判断请求方式是否为POST,如果是POST请求,则将请求数据传入表单对象中,形成一个绑定的表单对象。接着使用is_valid()方法验证表单数据是否合法。

如果数据合法,则可以在if form.is_valid():后执行表单的保存操作,如果数据不合法,则会自动显示错误信息,这也是Django内置表单验证机制的最大优点之一。

如果请求方式不是POST,则说明这是第一次访问该页面,我们需要创建一个空表单对象传给模板。

同时,在模板中也需要进行对应渲染:

<form method="post">
    {% csrf_token %}
    {{ form.username }}<br>
    {{ form.username.errors }}<br>
    {{ form.password }}<br>
    {{ form.password.errors }}<br>
    <input type="submit" value="Submit">
</form>

在模板中,我们使用{{ form.字段名 }}的方式渲染表单,同时也可以使用{{ form.字段名.errors }}来渲染表单验证失败时的错误信息。

示例1:判断是否为空

下面我们来演示一下如何对表单数据进行判断,假设我们需要对username和password进行非空判断,只有当都不为空时才允许提交。

实现方法如下:

class LoginForm(forms.Form):
    username = forms.CharField(max_length=20)
    password = forms.CharField(max_length=20)

    def clean(self):
        cleaned_data = super().clean()
        username = cleaned_data.get('username')
        password = cleaned_data.get('password')
        if not username or not password:
            raise forms.ValidationError('请填写必填项')

在这个表单类中,我们重写了clean()方法,通过super()方法获取到表单数据的字典,并通过get()方法获取到对应的数据。接着判断这两个字段是否都不为空,如果有空,则抛出forms.ValidationError()异常,并传入错误信息。这个异常将会自动在表单中进行渲染。

示例2:判断唯一性

如果我们需要对表单中的某个字段进行唯一性验证,该怎么实现?

例如,我们需要对username字段进行唯一性验证:

from django.core.exceptions import ObjectDoesNotExist

class LoginForm(forms.Form):
    username = forms.CharField(max_length=20)
    password = forms.CharField(max_length=20)

    def clean_username(self):
        username = self.cleaned_data['username']
        try:
            user = User.objects.get(username=username)
            raise forms.ValidationError('用户名已经存在')
        except ObjectDoesNotExist:
            pass
        return username

在这个表单类中,我们定义了一个clean_username()方法,该方法会在验证username字段时调用。在该方法中,我们首先使用self.cleaned_data['username']的方式获取到username字段的值。

然后使用try...except...结构查询数据库中是否已经存在该用户名,如果存在,则抛出forms.ValidationError()异常,并传入错误信息。如果不存在,则不进行任何操作。

最后,一定要记得返回username的值,以便在后续的操作中进行使用。

通过以上两个示例的讲解,相信你已经了解了Django如何实现表单验证的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django实现表单验证 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django-rest-framework框架 第四篇 认证Authentication

    认证Authentication 什么是身份认证 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或与其签名的令牌)关联的机制。 视图的最开始处运行身份验证 在权限和限制检查发生之前,以及在允许继续执行任何其他代码之前,始终在视图的最开始处运行身份验证。 身份验证方案总是定义为类的列表 REST框架尝试对列表中的每个类进行身份验证,并将成功身份验证的第…

    Django 2023年4月11日
    00
  • django和tornado的一些区别

    tornado和django的区别 从模板上来说 前端模板上的使用的语法有些区别 tornado可以通过render传类及函数 class Calculation: def sum(self,a,b): return a+b class UiHandler(tornado.web.RequestHandler): def func(self): return…

    Django 2023年4月10日
    00
  • Django笔记二之连接数据库、执行migrate数据结构更改操作

    本篇笔记目录索引如下: Django 连接mysql,执行数据库表结构迁移步骤介绍 操作数据库,对数据进行简单操作 接下来几篇笔记都会介绍和数据库相关,包括数据库的连接、操作(包括增删改查)、对应的字段类型、model 里Meta 相关参数和 QueryAPI 的详解等。 这一篇先介绍数据库的连接和简单的增删改查操作。 首先介绍一些 Django 的操作表的…

    2023年4月10日
    00
  • Django之模板

     一:   什么是模板?模板的作用? 二:模板的查找路径的配置 三:常用的模板的语法 四:常用的模板过滤器 五:自定义模板过滤器 六:引入模板 七:模板的继承 八:加载静态文件   一:什么是模板,模板的作用   模板就是一种带有特殊语法的html文件,它能够把表现形式和数据分离开来,然后通过视图返回给浏览器。 二:模板的查找路径:   在项目的settin…

    Django 2023年4月9日
    00
  • Django实现分页器功能

    要使用Django实现分页器,必须从Django中导入Paginator模块 from django.core.paginator import Paginator 假如现在有150条记录要显示,每页显示10条 1 >>> from django.core.paginator import Paginator#导入Paginator模块 2…

    Django 2023年4月13日
    00
  • Django:runserver实现远程访问

    Django自带的runserver实现远程访问 最近在Ubuntu服务器上创建了一个Django项目,想实现远程访问:新创建一个名为my_site的Django项目,目录结构如下: 项目结构 ../my_site/ ├── db.sqlite3 ├── manage.py └── my_site ├── __init__.py ├── __pycache_…

    Django 2023年4月13日
    00
  • xadmin2.0(for Django2.0) 基本设置

    一、下载xadmin 1.使用安装工具安装: pip install git+git://github.com/sshwsfc/xadmin.git@django2 2.下载源码: git clone https://github.com/sshwsfc/xadmin.git# 或者将文件夹中的xadmin文件夹,放到项目目录中,然后在setting.py中…

    Django 2023年4月11日
    00
  • 使用Django2.0打造小程序助手

    打造个人助手 主角: Django2.0 微信小程序(2017年元旦发布) 技术要求: python3开发基础 Django开发基础 HTML+CSS+JS 开发环境: Python开发环境:Python3.5+pycharm 小程序开发环境:微信开发者工具 系统开发环境:Windows(开发)+linux(部署) 依赖环境&工具 Postman(模…

    Django 2023年4月9日
    00
合作推广
合作推广
分享本页
返回顶部