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

Dav*_*gac 4 django django-registration

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

Tre*_*ner 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
Run Code Online (Sandbox Code Playgroud)


rz.*_*rz. 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
Run Code Online (Sandbox Code Playgroud)

在您的视图中,您可以DOBRegistrationForm像平常一样使用RegistrationForm.如果您使用的是registration.views.register刚刚传递的类作为form_class参数.

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