请求解答Django中cleaned_data与is_valid的区别及示例
Django表单中is_valid()与cleaned_data的区别
核心差异一句话讲清:
is_valid()是验证方法,用来检查用户提交的数据是否符合表单规则,返回布尔值True/False。cleaned_data是字典属性,只有在is_valid()返回True后,才会包含经过验证、格式转换后的安全数据。
简单示例
1. 先定义一个基础表单类
from django import forms class UserForm(forms.Form): username = forms.CharField(max_length=50, required=True) age = forms.IntegerField(min_value=18, max_value=100)
2. 在视图中使用表单的完整流程
from django.shortcuts import render def register(request): if request.method == 'POST': # 用用户提交的POST数据初始化表单 form = UserForm(request.POST) # 第一步:调用is_valid()触发验证 if form.is_valid(): # 验证通过后,从cleaned_data取处理好的安全数据 username = form.cleaned_data['username'] age = form.cleaned_data['age'] # 这里可以执行存数据库、发邮件等业务逻辑 # User.objects.create(username=username, age=age) return render(request, 'success.html', {'username': username}) else: # 验证失败,form.errors会包含错误提示,返回表单让用户修正 return render(request, 'register.html', {'form': form}) else: # GET请求返回空表单 form = UserForm() return render(request, 'register.html', {'form': form})
关键细节提醒
- 跳过
is_valid()直接访问cleaned_data会得到空字典,因为验证流程没触发,数据没被清理转换。 is_valid()会自动完成数据转换:比如用户输入的age是字符串"25",它会转成整数25存入cleaned_data['age'];如果输入"abc",is_valid()返回False,cleaned_data保持为空。- 自定义校验逻辑(比如重写
clean_xxx方法)也会在is_valid()调用时执行,校验通过后的结果才会进入cleaned_data。
举个自定义校验的例子:
class UserForm(forms.Form): username = forms.CharField(max_length=50, required=True) age = forms.IntegerField(min_value=18, max_value=100) def clean_username(self): username = self.cleaned_data.get('username') if username and 'admin' in username.lower(): raise forms.ValidationError("用户名不能包含'admin'") return username
调用is_valid()时会执行这个校验,不符合规则就返回False,符合的话,处理后的username才会存入cleaned_data。
内容的提问来源于stack exchange,提问作者janezio
相关产品推荐
相关产品推荐

