¿Cómo puedo añadir la verificación de edad a un formulario de registro de Django?
-
09-10-2019 - |
Pregunta
Tengo una aplicación Django que está utilizando django-registro para manejar registro de nuevos usuarios. Me gustaría añadir la fecha de nacimiento al formulario de inscripción para que pueda comprobar la edad del usuario antes de decidir si se debe permitir que se registren. Sin embargo, no necesito o quiero ni almacenar su fecha de nacimiento como la información del perfil. ¿Cómo puedo añadir esto a la forma de registro y validación de su edad, como parte del proceso de registro?
Solución
Extender la incorporada en el formulario de registro para agregar el campo de fecha de nacimiento y un método para validar LIMPIO_ que es antes de un cierto tiempo. Algo así como:
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
En su punto de vista que utilizan DOBRegistrationForm
igual que lo haría el RegistrationForm
normal. Si está utilizando el registration.views.register
acaba de pasar la clase como parámetro form_class
.
De esta manera se obtendrá un error de forma, si su fecha de nacimiento no está en el rango permitido sin crear ninguna fila en la base de datos.
Otros consejos
Hay un pequeño defecto en la respuesta de rz, ya que no tiene en cuenta años bisiestos.
Si alguien nace el 1 de enero de 1994, la fecha de nacimiento de verificación mencionado en la respuesta de rz calculará como siendo 18 el 28 de diciembre de 2011.
Aquí hay una versión alternativa que lleva años bisiestos en cuenta:
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