详解Django的 clean() 函数:定义表单字段的清理行为

Django clean()函数的作用与使用方法攻略

在 Django 中,clean() 函数是一个非常有用的方法,可以帮助我们校验表单提交的数据并返回经过校验后的数据。

作用

clean() 函数作用是在 Django Form 表单数据进行提交前进行校验,并将校验过后的数据返回。

校验的过程中,我们可以对该数据进行一些操作,比如格式化数据、消除不必要的数据、检查数据是否符合要求等等。在校验时,clean() 函数的一个重要特征是,如果该数据不符合规范,我们可以抛出一个错误,这样表单就不会被提交到后台。

使用方法

Django 的 clean() 一般是在 Django Form 中定义。我们首先要在 forms.py 文件中定义一个继承 forms.Form 的类,然后在该类中写入需要校验的字段,并在每个字段后面定义一个 clean_ 前缀的方法,这个方法应该返回一个经过校验过后的值。

下面是一个简单的例子,我们来看一下 clean() 函数是如何校验数据并返回校验后的数据的:

from django import forms
from .models import Book


class BookForm(forms.Form):
    title = forms.CharField(max_length=100)
    author = forms.CharField(max_length=100)
    published_date = forms.DateField()

    def clean_title(self):
        title = self.cleaned_data['title']
        if Book.objects.filter(title=title).exists():
            raise forms.ValidationError('This title has already been used.')
        return title

    def clean_author(self):
        author = self.cleaned_data['author']
        if len(author) < 3:
            raise forms.ValidationError('Author name must be at least 3 characters long.')
        return author

    def clean(self):
        cleaned_data = super().clean()
        published_date = cleaned_data.get('published_date')
        if published_date and published_date > timezone.now().date():
            raise forms.ValidationError('The published date cannot be in the future.')
        return cleaned_data

以上代码演示了如何定义一个简单的 Django 表单,该表单有三个校验字段,即 titleauthorpublished_date。前两个字段自定义了校验方法,published_date 字段则使用了默认的校验方式。

在上述代码中,clean_titleclean_author 方法自定义了数据的校验方式。每个方法都会返回一个值,如果数据不符合规范则抛出一个错误。使用这种方式能够更好地控制数据的校验和处理。

clean() 方法用于校验整个表单,它也是在 cleaned_data 中返回校验后的数据。在这种情况下,我们使用了 super().clean() 方法来检验并返回经过校验的数据,然后检查 published_date 是否被设置为未来的日期。如果是,则抛出一个 ValidationError。如果没有错误,则返回所有校验过后的数据。

实例

下面给出两个实例来说明 clean() 函数的使用方法。

1. 校验注册表单中的密码是否匹配

在这个例子中,我们来考虑一个注册表单。这个表单中有两个字段,分别是密码和确认密码。我们需要校验这两个字段的值是否相等。

from django import forms

class RegisterForm(forms.Form):
    username = forms.CharField(max_length=100)
    email = forms.EmailField(max_length=100)
    password = forms.CharField(widget=forms.PasswordInput())
    confirm_password = forms.CharField(widget=forms.PasswordInput())

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get("password")
        confirm_password = cleaned_data.get("confirm_password")

        if password != confirm_password:
            raise forms.ValidationError(
                "The two password fields must match."
            )

        return cleaned_data

在上述代码中,我们定义了一个继承自 forms.Form 的类 RegisterForm,其中有 passwordconfirm_password 两个字段。我们使用了 widget=forms.PasswordInput() 来隐藏输入密码的字符。接着,我们定义了一个名为 clean() 的内置校验函数。在此函数中,我们首先调用 super().clean() 函数来获取经过基础校验后的数据。然后,我们检查 passwordconfirm_password 是否相等,如果不相等,则抛出错误,系统就会抵制这个表单提交。

2. 校验注册表单中的用户名是否已存在

这个例子和上面的例子比较类似,我们考虑一个注册表单中的用户名校验。假设我们要保证用户名不重复。

from django import forms
from .models import User

class RegisterForm(forms.Form):
    username = forms.CharField(max_length=100)
    email = forms.EmailField(max_length=100)
    password = forms.CharField(widget=forms.PasswordInput())
    confirm_password = forms.CharField(widget=forms.PasswordInput())

    def clean_username(self):
        username = self.cleaned_data['username']
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError('This username has been taken.')
        return username

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get("password")
        confirm_password = cleaned_data.get("confirm_password")

        if password != confirm_password:
            raise forms.ValidationError(
                "The two password fields must match."
            )

        return cleaned_data

上面的代码中,我们调用了 User.objects.filter(username=username).exists() 方法检查是否存在了这个用户名。如果存在则抛出一个错误。接着,我们使用 clean() 函数来校验密码是否匹配,如果不匹配则也抛出一个错误。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Django的 clean() 函数:定义表单字段的清理行为 - Python技术站

(0)
上一篇 2023年3月23日
下一篇 2023年3月23日

相关文章

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

    Django中的is_valid()函数 is_valid()函数是Django中表单类Form的一个方法,用于验证表单数据的有效性。如果表单数据有效,它将返回True,否则返回False。使用is_valid()函数可以方便地验证用户提交的表单数据的有效性,从而进行后续的处理。 用法 在Django中,is_valid()函数一般是在视图函数中使用。在处理…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 annotate() 函数:对查询结果进行聚合

    下面是Django的annotate()函数的作用与使用方法的完整攻略: 1. annotate()函数的作用 annotate()函数是Django的Model API中的一个高级查询函数,它的作用是对查询结果进行注解、统计和计算,并将这些结果添加到查询结果的每个对象中。可以理解为给查询结果增加一个字段,这个字段的值是统计、注解和计算后的结果。 2. an…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_object_or_404() 函数:获取模型对象或返回 404 错误

    Django中的get_object_or_404()函数 作用 get_object_or_404()函数用于获取一个模型实例对象,如果对象不存在则返回404错误页面。 使用方法 在视图函数中引入函数库: from django.shortcuts import get_object_or_404 该函数有两个参数,一个是模型类,一个是查询条件,如下: g…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 order_by() 函数:对查询结果进行排序

    下面是关于Django中order_by()函数的作用、使用方法和示例的详细攻略。 1. order_by()函数的作用 order_by()函数是Django中常用的一个方法,用于对查询结果进行排序。通过该方法,可以按照指定的字段对查询结果进行升序、降序排列,从而方便地对查询结果进行控制和操作。 2. order_by()函数的使用方法 order_by(…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_or_none() 函数:获取对象或返回 None

    Django中get_or_none()函数的作用与使用方法 get_or_none()函数是Django ORM提供的一种方便的函数,用于获取一条数据库记录,当记录不存在时,返回None而不是抛出DoesNotExist异常。 具体而言,get_or_none()函数会根据传入的筛选条件从数据库中获取一条记录,如果记录存在,则返回该记录;如果记录不存在,则…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 logout() 函数:用户退出

    接下来我将详细讲解Django的logout()函数。 1. 登出功能简介 logout() 是 Django 内置的用于登出操作的函数,它可以帮助网站实现用户退出功能。 2. logout() 函数的用法 def logout(request): request 是用户发出的请求,调用 logout() 函数即可执行登出操作。具体代码格式如下: from …

    Django函数大全 2023年3月23日
    00
  • 详解Django的 page_range() 函数:获取页码范围

    首先,page_range()函数是Django自带分页器Paginator中的一个方法。它的主要作用是返回当前页左右两侧的页码范围。 使用方法如下: from django.core.paginator import Paginator items = [‘item1’, ‘item2’, ‘item3’, ‘item4’, ‘item5’, ‘item6…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_failure_url() 函数:获取表单处理失败后的跳转 URL

    Django的get_failure_url()函数 get_failure_url() 是 Django 中的一个负责处理表单验证失败后返回的 URL 的函数,它允许开发人员定义表单验证失败后的重定向地址。 作用 当一个表单被提交,但是表单验证失败时,get_failure_url() 函数会被调用。 当检测到表单验证失败时,Django 框架自动重定向到…

    Django函数大全 2023年3月23日
    00
合作推广
合作推广
分享本页
返回顶部