2010-12-13 100 views
4

我有一個Django應用程序使用django-registration來處理新的用戶註冊。我想在登記表上添加出生日期,以便在決定是否允許他們註冊之前檢查用戶的年齡。不過,我不需要甚至不想將他們的出生日期存儲爲個人資料信息。我怎樣才能將其添加到註冊表單中,並將其年齡作爲註冊過程的一部分進行驗證?如何將年齡驗證添加到django註冊表單中?

回答

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不在數據庫中創建任何行的允許範圍內,他們將得到一個表單錯誤。

+0

完美!只有這個例子的問題是,你不能從日期時間中減去一個日期,但是這讓我得到了我需要的地方。謝謝。 – 2010-12-14 05:49:58

+0

Trey給出的解決方案更準確。 – GetItDone 2013-06-25 12:54:28

8

rz的回答存在一個小缺陷,因爲它沒有考慮到閏年。

如果某人出生於1994年1月1日,在RZ的回答中提到的生日檢查將計算它們爲12月18日28日,2011年

這裏有一個替代版本,需要閏年考慮:

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 
+0

謝謝,請注意你有bod.day而不是dob.day。編輯的更改太小 – sidarcy 2014-02-27 10:12:44