2010-12-13 17 views
4

新しいユーザー登録を処理するためにdjango-registrationを使用しているDjangoアプリケーションがあります。登録を許可するかどうかを決定する前に、ユーザーの年齢を確認できるように、登録フォームに生年月日を追加したいと思います。しかし、私はプロファイル情報として生年月日を保存する必要はありません。これを登録フォームに追加し、登録プロセスの一環として年齢を検証するにはどうすればよいですか?Django登録フォームに年齢認証を追加するにはどうすればよいですか?

答えて

5

組み込みの登録フォームを拡張して、DOBフィールドとclean_メソッドを追加して、特定の時刻より前であることを検証します。あなただけだろう通常のRegistrationFormようDOBRegistrationFormを使用し、あなたの意見で

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.views.registerを使用している場合は、クラスをform_classパラメータとして渡すだけです。

この方法では、データベースに行を作成せずにDOBが許容範囲内にない場合、フォームエラーが発生します。

+0

パーフェクト!この例の問題は、datetimeから日付を引くことができないということだけですが、これは私が必要とするところに私をもたらしました。ありがとう。 –

+0

以下のTreyの解はより正確です。 – GetItDone

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

ありがとう、dob.dayの代わりにbod.dayがあることに注意してください。編集するには小さすぎる – sidarcy

関連する問題