2010-12-13 26 views
4

J'ai une application Django qui utilise django-registration pour gérer l'enregistrement de nouveaux utilisateurs. Je voudrais ajouter la date de naissance au formulaire d'inscription afin que je puisse vérifier l'âge de l'utilisateur avant de décider s'il faut l'autoriser à s'inscrire. Cependant je n'ai pas besoin ou même ne veux pas stocker leur date de naissance comme information de profil. Comment puis-je ajouter ceci au formulaire d'inscription et valider leur âge dans le cadre du processus d'inscription?Comment puis-je ajouter la vérification de l'âge à un formulaire d'enregistrement django?

Répondre

5

Étendre le formulaire d'inscription intégré pour ajouter le champ DOB et une méthode clean_ pour valider qu'il est avant un certain temps. Quelque chose comme:

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 

Dans vos vues que vous utilisez DOBRegistrationForm comme vous le feriez le RegistrationForm normal. Si vous utilisez le registration.views.register il suffit de passer la classe en tant que paramètre form_class. De cette façon, ils obtiendront une erreur de forme si leur DOB n'est pas dans la plage autorisée sans créer de lignes dans la base de données.

+0

Parfait! Le seul problème avec l'exemple est que vous ne pouvez pas soustraire une date d'un datetime, mais cela m'a amené là où je devais être. Merci. –

+0

La solution ci-dessous donnée par Trey est plus précise. – GetItDone

8

Il y a un défaut mineur dans la réponse de rz en ce sens qu'il ne tient pas compte des années bissextiles.

Si quelqu'un est né le 1er Janvier 1994, le contrôle de la date de naissance mentionné dans la réponse de rz les calculerons comme 18 le 28 Décembre 2011.

est ici une autre version qui prend des années bissextiles:

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

Merci, notez que vous avez bod.day au lieu de dob.day. trop petit changement pour éditer – sidarcy