我有这个模型.py
from django.contrib.auth.models import AbstractUser
from django.core.exceptions import ValidationError
# Create your models here.
class User(AbstractUser):
class genders(models.TextChoices):
MALE = 'MALE'
FEMALE = 'FEMALE'
username = models.CharField(max_length=20,unique=True)
email = models.EmailField()
password = models.CharField(max_length=50)
gender = models.CharField(max_length=6,choices=genders.choices,default=None)
birthday = models.DateField()
def verify_gender():
super().clean()
if User.gender not in User.genders:
raise ValidationError("Choice must be either 1 or 2.")
return User.gender
USERNAME_FIELD = 'username'
我的目标是不让任何不正确的数据进入性别字段
我没有在 django admin 中进行测试,但是通过 django shell 进行测试时,类似 sex='BLABLABLA' 没有返回错误
我认为这是函数 verify_gender 的问题,但老实说我看不到任何错误,一切正常,所以它符合模型的逻辑
为了确保在 Django 中用户模型的性别字段中只输入有效的选择,您需要正确实现自定义验证方法,然后在模型的 clean 方法中调用它。
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'
username = models.CharField(max_length=20, unique=True)
email = models.EmailField()
password = models.CharField(max_length=50)
gender = models.CharField(max_length=6, choices=Genders.choices, default=None)
birthday = models.DateField()
def clean(self):
super().clean()
self.verify_gender()
def verify_gender(self):
if self.gender not in self.Genders.values:
raise ValidationError("Invalid gender choice. Must be 'MALE' or 'FEMALE'.")
USERNAME_FIELD = 'username'
验证实例方法:定义
verify_gender
方法来检查性别值。此方法现在可以正确引用实例属性 self.gender
。
Clean 方法:重写 clean 方法以调用
verify_gender
方法。 super().clean()
调用确保父类中的任何验证逻辑也被执行。
在 Django Shell 中测试
from yourapp.models import User
from django.core.exceptions import ValidationError
# Create a new user with valid gender
try:
user = User(username='testuser', email='[email protected]', password='password', gender='MALE', birthday='2000-01-01')
user.clean() # Explicitly call clean to test validation
user.save()
print("User created successfully with valid gender.")
except ValidationError as e:
print("Validation error:", e)
# Create a new user with invalid gender
try:
user = User(username='testuser2', email='[email protected]', password='password', gender='BLABLABLA', birthday='2000-01-01')
user.clean() # Explicitly call clean to test validation
user.save()
print("User created successfully with invalid gender.")
except ValidationError as e:
print("Validation error:", e)