如何在Django中验证自定义字段数据?性别字段校验失效问题
问题分析与修复方案
你的代码里有几个关键问题导致gender字段的验证不生效:
自定义方法未被Django验证机制触发
Django模型的验证逻辑需要通过重写clean()方法来实现,你定义的verify_gender()不会被自动调用,所以设置非法值时不会触发校验。方法缺少实例参数
self
模型方法需要self参数才能访问当前实例的属性,你的verify_gender()没有这个参数,根本无法获取到当前用户的gender值。验证逻辑错误
- 你用
User.gender访问的是类属性,不是当前实例的gender值,应该用self.gender。 - 判断是否合法的方式不对,应该检查值是否在
genders.values里,而不是直接和User.genders类比较。
- 你用
重复定义AbstractUser自带字段
AbstractUser已经包含username、email、password字段,重复定义可能引发冲突,建议删除这些重复字段。gender字段的默认值与null设置不匹配
设置default=None但没有开启null=True,会导致数据库层面不允许null值,可能引发错误。
修改后的models.py代码
from django.contrib.auth.models import AbstractUser from django.core.exceptions import ValidationError from django.db import models class User(AbstractUser): class genders(models.TextChoices): MALE = 'MALE' FEMALE = 'FEMALE' # 删除AbstractUser已有的字段:username、email、password gender = models.CharField( max_length=6, choices=genders.choices, default=None, null=True # 允许数据库存储null值 ) birthday = models.DateField(null=True) # 可选:如果允许生日为空,添加null=True def clean(self): super().clean() # 验证gender是否为合法选项 if self.gender is not None and self.gender not in self.genders.values: raise ValidationError("gender必须是'MALE'或'FEMALE'") USERNAME_FIELD = 'username'
验证生效的测试方式
在Django Shell中测试:
from yourapp.models import User # 创建非法gender的用户,会触发ValidationError user = User(username='test', email='test@example.com', password='123456', gender='BLABLABLA', birthday='2000-01-01') user.full_clean() # 必须调用full_clean()才会触发模型的clean方法,save()时也会自动调用
这样设置非法gender值时,就会抛出ValidationError,阻止非法数据存入数据库。
内容的提问来源于stack exchange,提问作者Adryan Taborda
相关产品推荐
相关产品推荐

