Comment puis-je ajouter la vérification de l'âge à une forme django-inscription?
-
09-10-2019 - |
Question
J'ai une application Django qui utilise django-inscription pour gérer l'enregistrement de nouveaux utilisateurs. Je voudrais ajouter la date de naissance du formulaire d'inscription afin que je puisse vérifier l'âge de l'utilisateur avant de décider de leur permettre d'enregistrer. Cependant, je ne ai pas besoin ou même envie de stocker leur date de naissance que des informations de profil. Comment puis-je ajouter à la fiche d'inscription et de valider leur âge dans le cadre du processus d'inscription?
La solution
Étendre le haut-formulaire d'inscription pour ajouter le champ de date de naissance et une méthode de 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 votre point de vue que vous utilisez DOBRegistrationForm
comme vous le feriez le RegistrationForm
normal. Si vous utilisez le registration.views.register
juste passer la classe comme paramètre form_class
.
De cette façon, ils obtiennent une erreur de forme si leur date de naissance ne sont pas dans la plage autorisée sans créer de lignes dans la base de données.
Autres conseils
Il y a une faille mineure dans la réponse de rz en ce qu'elle ne prend pas en 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.
Voici 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