У меня есть приложение Django, которое использует django-registration для обработки новой регистрации пользователя. Я хотел бы добавить дату рождения в регистрационную форму, чтобы я мог проверить возраст пользователя, прежде чем принимать решение о том, разрешить ли они регистрироваться. Однако мне не нужно или даже хочу сохранить дату рождения в качестве информации о профиле. Как я могу добавить это в регистрационную форму и подтвердить свой возраст как часть процесса регистрации?Как добавить возрастную регистрацию в регистрационную форму django?
ответ
Расширьте встроенную регистрационную форму, чтобы добавить поле 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 не находится в допустимом диапазоне без создания каких-либо строк в базе данных.
Существует незначительная ошибка в ответе rz в том, что она не учитывает високосные годы.
Если кто-то родился 1 января 1994 года проверка дата рождения упоминается в ответ RZ будет вычислять их как 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
Спасибо, заметьте, у вас есть bod.day вместо dob.day. слишком мало изменений для редактирования – sidarcy
Отлично! Только проблема с примером заключается в том, что вы не можете вычесть дату из даты, но это привело меня к тому, где я должен был быть. Благодарю. –
Решение, приведенное Трей, более точно. – GetItDone