如何在Django中验证自定义字段数据?

问题描述 投票:0回答:1

我有这个模型.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-models
1个回答
0
投票

为了确保在 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)
© www.soinside.com 2019 - 2024. All rights reserved.