如何在django注册表中添加年龄验证?

如何在django注册表中添加年龄验证?,django,django-registration,Django,Django Registration,我有一个Django应用程序,用于处理新用户注册。我想将出生日期添加到注册表中,以便在决定是否允许用户注册之前检查用户的年龄。但是,我不需要甚至不想将他们的出生日期存储为个人资料信息。如何将其添加到注册表中,并作为注册表过程的一部分验证其年龄?扩展内置注册表以添加DOB字段和clean_uu方法以验证其是否在某个时间之前。比如: from datetime import datetime from registration.forms import RegistrationForm class

我有一个Django应用程序,用于处理新用户注册。我想将出生日期添加到注册表中,以便在决定是否允许用户注册之前检查用户的年龄。但是,我不需要甚至不想将他们的出生日期存储为个人资料信息。如何将其添加到注册表中,并作为注册表过程的一部分验证其年龄?

扩展内置注册表以添加DOB字段和clean_uu方法以验证其是否在某个时间之前。比如:

from datetime import datetime
from registration.forms import RegistrationForm

class DOBRegistrationForm(RegistrationForm):
    date_of_birth = forms.DateField()

    def clean_date_of_birth(self):
        dob = self.cleaned_data['date_of_birth']
        age = (datetime.now() - dob).days/365
        if age < 18:
            raise forms.ValidationError('Must be at least 18 years old to register')
        return dob
从日期时间导入日期时间
从registration.forms导入RegistrationForm
类别登记表(登记表):
出生日期=forms.DateField()
def清洁日期出生日期(自我):
dob=自我清理的数据[“出生日期”]
年龄=(datetime.now()-dob).days/365
如果年龄<18岁:
raise forms.ValidationError('必须至少18岁才能注册')
返回dob
在视图中,您可以像使用普通的注册表单一样使用注册表单。如果您使用的是
registration.views.register
,只需将类作为
form\u class
参数传递即可


这样,如果他们的DOB不在允许的范围内,而不在数据库中创建任何行,他们将得到一个表单错误。

rz的答案有一个小缺陷,它没有考虑闰年

如果有人是在1994年1月1日出生的,rz的答案中提到的出生日期检查将计算为2011年12月28日的18岁

这里有一个考虑闰年的替代版本:

from datetime import date
from registration.forms import RegistrationForm

class DOBRegistrationForm(RegistrationForm):
    date_of_birth = forms.DateField()

    def clean_date_of_birth(self):
        dob = self.cleaned_data['date_of_birth']
        today = date.today()
        if (dob.year + 18, dob.month, bod.day) > (today.year, today.month, today.day):
            raise forms.ValidationError('Must be at least 18 years old to register')
        return dob

完美的这个例子唯一的问题是你不能从一个日期时间中减去一个日期,但这让我达到了我需要的位置。谢谢。Trey给出的以下解决方案更准确。谢谢,请注意,您使用的是bod.day而不是dob.day。更改太小,无法编辑