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

yizhihongxing

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的 get_or_none() 函数:获取对象或返回 None

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

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_page_title() 函数:获取页面标题

    Django的get_page_title()函数使用方法及作用 Django的get_page_title()函数是一个用于生成页面标题的辅助函数,它通常用于管理网站的不同页面的标题显示。该函数可以根据传入的不同参数生成不同的标题。 使用方法: 在Django的视图函数中调用get_page_title()函数时,需要将页面标题作为参数传递到函数中。可以传…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 count() 函数:统计查询结果的数量

    当使用Django ORM进行数据库查询时,我们经常需要统计查询结果的数量。这时就可以使用Django提供的count()方法。下面是对count()函数作用与使用方法的完整攻略: 作用 count()方法用来统计符合查询条件的结果数量,返回一个整数。它通常用于数据分析、数据报表等场景。 使用方法 count()方法可以用在查询集(QuerySet)上,也可…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_success_json() 函数:获取表单验证成功后的 JSON 数据

    Django中的get_success_json()函数是一个通用的视图mixin中的一个方法。其作用是返回一个JSON对象,该JSON对象包含成功状态的信息。 在Django中,一些类视图提供一个mixin机制,用于增强视图的功能。其中一个通用的mixin是SingleObjectMixin,它允许我们检索一个单一的对象并将其传递给模板或JSON格式。如果…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 page_kwarg() 函数:指定分页查询参数的名称

    page_kwarg()是Django中一个用于分页的辅助函数。它的作用是获取Web请求中提供的Page参数,并将其加入到作为分页查询参数的字典中。我们可以通过这个函数来设置分页参数的默认值。 该函数的具体参数如下: page_kwarg(page_query_param=’page’) page_query_param:分页参数的名称,默认为“page”。…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_form() 函数:获取视图所使用的表单实例

    下面是关于 Django 的 get_form() 函数的详细讲解。 1. get_form() 函数的作用 get_form() 是 Django 中一个非常重要的函数,其作用是返回一个表单实例,在视图函数中常常用于修改或者添加数据时,使用不同类型的表单进行数据的处理。 2. get_form() 函数的使用方法 通常情况下,get_form() 函数需要…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 login_required() 函数:装饰器,限制未登录用户访问视图

    Django的login_required()函数是一个装饰器,它用于保护一个视图或者一个视图函数,在用户未登陆的情况下,会自动重定向到Django默认的登陆页面。本文将详细讲解login_required()函数的使用方法,并为您提供两个实例说明。 login_required()函数的使用方法 login_required()函数必须与视图函数搭配使用,…

    Django函数大全 2023年3月23日
    00
  • 详解Django的 get_or_create() 函数:获取或创建一个对象

    Django中get_or_create()函数的作用与使用方法 作用 get_or_create() 函数是 Django ORM 中常用的查询函数之一,用于查询数据库中数据是否存在,如果不存在则创建新的一条数据,如果存在则返回已经存在的一条数据。 使用方法 get_or_create() 函数的参数包含两部分: 查询条件,即获取的数据的过滤条件。 创建的…

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