如何将年龄验证添加到django-registration表单中?

时间:2010-12-13 20:10:59

标签: django django-registration

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

扩展内置注册表单以添加DOB字段和clean_方法,以验证它是否在某个时间之前。类似的东西:

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

在您的观看中,您使用DOBRegistrationForm,就像使用普通RegistrationForm一样。如果您使用的是registration.views.register,请将该类作为form_class参数传递。

这样,如果DOB不在允许的范围内而不在数据库中创建任何行,则会出现表单错误。