详解Django的 is_valid() 函数:判断表单是否验证成功

  • Post category:Python

is_valid()是Django表单中一个非常重要的函数,它用于检查表单提交的数据是否符合设置的要求。在表单验证环节,是最核心、最基础的函数之一。

is_valid() 的作用

is_valid() 函数的作用是用于验证表单数据是否合法。在表单提交的时候,is_valid() 函数运行时,会对POSTGET请求提交上来的数据进行验证,如果验证通过,则保存到表单实例的cleaned_data属性中,以便后续处理。

如果 is_valid() 函数返回值为 True,则说明表单数据有效,数据存储在表单中的cleaned_data属性中;如果返回值为False,则说明表单数据无效,需要在表单页面显示错误信息,显示表单错误的原因通常源于用户输入不符合规定数据格式或者必填项未填写。

is_valid() 的使用

is_valid() 函数通常在视图中的POST请求中使用,可以基本如下方式:

from django.shortcuts import render
from .forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理数据
            pass
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})

首先,在该示例中通过request.POST这个QueryDict(字典-like对象)来创建了一个ContactForm类的实例,并将验证结果存储在form变量中。其次,判断form是否有效,如果有效则进行数据保存处理。

在表单验证时,可以使用Form验证方法和自定义验证方法两种方式。使用自带表单验证方法时,只需要定义表单类class ContactForm(forms.Form)并在其中定义相应的验证规则即可。如,下面的例子:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=50, required=True, label='姓名')
    email = forms.EmailField(required=True, label='邮箱')
    message = forms.CharField(widget=forms.Textarea, required=True, label='内容', help_text='最大长度200', max_length=200)

通过在cleaned_data字典属性中获取处理后的值,如:

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            message = form.cleaned_data['message']
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})

这里使用了validated_data来获取经过验证之后的数据进行操作。若未通过验证,则会抛出验证异常,在form.errors和form.non_field_errors属性中保存错误信息。通过form的errors属性,我们可以获取包含错误信息的字典,返回的数据格式如下:

{'字段名称': ['错误信息']}

实例1

下面举例一个简单的登录表单验证的例子:

from django.shortcuts import render
from django.http import HttpResponse
from .forms import LoginForm

def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            # 处理登录请求
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return HttpResponse('登录成功')
            else:
                form.add_error(None, '用户名或密码错误')
    else:
        form = LoginForm()
    return render(request, 'login.html', {'form': form})

此例中,LoginForm 通过自己的clean()函数来实现表单验证,自定义了用户名/password须均输入的非空验证。然后if form.is_valid()判断如果验证通过后获取值,进行可视化反馈和用户登录处理。

实例2

再看一个增加文章的实例。假如我们要实现一个文章增加的表单,为每篇文章添加标签,标签名的验证大致为:

  • 长度不应超过20个字符
  • 非空字符

基于以上规则,我们可以在form的验证的cleaned_data中加入自己的验证规则,代码如下:

from django import forms


class AddArticleForm(forms.Form):
    title = forms.CharField(min_length=3, max_length=100, label='文章标题')
    content = forms.CharField(min_length=3, widget=forms.Textarea(), label='文章内容')
    tag_name = forms.CharField(max_length=20, label='标签名称')

    def clean_tag_name(self):
        data = self.cleaned_data['tag_name']
        if not data:
            raise forms.ValidationError('标签名不能为空')
        if len(data) > 20:
            raise forms.ValidationError('标签名长度不应超过20个字符')
        return data

在添加article页面中,也只需要加入form的展示即可:

<form method="POST" action="">
    {%csrf_token %}
    {{ form.as_p }}
    <button type="submit">确定</button>
</form>

总结

以上就是 is_valid() 函数的详细讲解。在使用 Django 开发时,再常见不过的是表单数据的验证。在表单类实例化之后,我们通常要对用户提交的表单数据进行验证,这就是 is_valid() 函数的主要作用 —— 检查表单数据是否符合我们所期望的要求。因此,is_valid() 函数在 Django 表单验证工作流程中是最为重要的一个环节。