能否将Django验证器应用于属性而非字段?需确保年龄不小于18
Django验证器能否应用于属性而非字段?
Django的内置验证器默认是绑定到模型字段上的,没法直接把验证器应用到像age这种通过字段计算出来的属性上,但可以通过以下两种方式实现“保证age不小于18”的需求:
1. 利用模型的clean()方法做自定义验证
模型的clean()方法是专门用于模型级自定义验证的钩子,你可以在这里计算age并做取值判断,不符合要求就抛出验证错误。
示例代码:
from django.db import models from django.core.exceptions import ValidationError from datetime import date class UserProfile(models.Model): dob = models.DateField(verbose_name="出生日期") @property def age(self): # 计算当前年龄 today = date.today() return today.year - self.dob.year - ((today.month, today.day) < (self.dob.month, self.dob.day)) def clean(self): # 先调用父类的clean方法 super().clean() # 验证年龄 if self.age < 18: raise ValidationError("年龄不能小于18岁")
当你保存模型实例时,clean()方法会自动触发,一旦age小于18就会抛出错误,阻止实例保存。如果在表单中使用该模型,表单也会自动调用这个方法做验证。
2. 在表单中做验证(如果使用表单提交数据)
如果是通过表单处理用户输入,可以直接在表单的字段验证方法里计算年龄并判断,这样能在数据进入模型前就完成验证。
示例代码:
from django import forms from django.core.exceptions import ValidationError from datetime import date from .models import UserProfile class UserProfileForm(forms.ModelForm): class Meta: model = UserProfile fields = ["dob"] def clean_dob(self): dob = self.cleaned_data.get("dob") today = date.today() age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day)) if age < 18: raise ValidationError("年龄不能小于18岁") return dob
简单来说,虽然不能直接把Django验证器绑定到属性上,但通过模型或表单的自定义验证逻辑,完全可以实现对age取值的限制。
内容的提问来源于stack exchange,提问作者Jose Machado
相关产品推荐
相关产品推荐

