0Pricing
Django Academy · 课时

使用 clean 方法进行自定义验证

添加字段级和表单级验证规则

使用 clean 方法进行自定义验证 是 CoddyKit 上的免费 Django Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Django Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Django Academy 课程共包含 4 节课。

本课时的部分内容尚未翻译,以英文显示。

Beyond Built-in Rules

Model fields give you basic checks, but real apps need custom rules. Django runs your own clean methods to enforce exactly the logic you want. 🧹

Field-Level clean

To validate one field, add a method named clean_fieldname. Django calls it automatically during validation for that single field.

def clean_title(self):
    title = self.cleaned_data["title"]
    return title

Read from cleaned_data

Inside a clean method, pull the value from cleaned_data. By this point Django has already converted it to the right Python type for you.

title = self.cleaned_data["title"]

Raise to Reject

If a value breaks your rule, raise a ValidationError. Django catches it and shows the message next to that field in the form.

from django.core.exceptions import ValidationError
raise ValidationError("Title is too short.")

A Real Field Check

Here we reject titles shorter than five characters. Note you must return the value at the end so it stays in cleaned_data.

def clean_title(self):
    title = self.cleaned_data["title"]
    if len(title) < 5:
        raise ValidationError("Too short.")
    return title

Always Return the Value

The golden rule of clean_fieldname: return the cleaned value. Forget it and the field becomes None, even when input was valid.

Form-Level clean

To compare two fields, override the whole-form clean method. It runs after every field-level check has finished.

def clean(self):
    cleaned = super().clean()
    return cleaned

Call super().clean() First

Begin your form-level clean by calling super().clean(). That gives you the full cleaned_data dict gathered from the field checks.

cleaned = super().clean()
start = cleaned.get("start")
end = cleaned.get("end")

Compare Two Fields

Now you can enforce cross-field rules, like making sure end comes after start. Raise ValidationError when the relationship is wrong.

if start and end and end < start:
    raise ValidationError("End must be after start.")

Attach Errors to a Field

In form-level clean you can target one field with add_error. The message then appears right beside that input, not at the top.

self.add_error("end", "End must be after start.")

Order of Validation

Django runs each clean_fieldname first, then the form-level clean last. Knowing this order helps you place each rule in the right spot.

Quick Check

Where should a rule that compares two fields live?

Recap: Custom Validation

Well done! Use clean_fieldname for single fields and form-level clean for cross-field rules. Raise ValidationError to reject, and always return cleaned values. 🎉

常见问题解答

「使用 clean 方法进行自定义验证」课时是免费的吗?

是的 — 「使用 clean 方法进行自定义验证」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Django Academy 课程的其余内容,请升级到 CoddyKit PRO。 Django Academy 课程共包含 4 节课。

「使用 clean 方法进行自定义验证」这节课中我会学到什么?

添加字段级和表单级验证规则 你通过在浏览器中直接运行的动手代码来练习 Django Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Django Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Django Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 clean 方法进行自定义验证」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Django Academy 课中编写并运行代码吗?

能。每节 Django Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 声明 ModelForm 与 Meta.fields
  2. form.save() 与 commit=False
  3. 使用 clean 方法进行自定义验证
  4. 控件、标签和帮助文本
← 返回 Django Academy