Wie kann ich die Altersüberprüfung auf ein django-Anmeldeformular hinzufügen?
-
09-10-2019 - |
Frage
Ich habe eine Django-Anwendung, die django-Registrierung wird mit neuen Benutzerregistrierung zu handhaben. Ich mag Geburtsdatum zum Anmeldeformular hinzufügen, so dass ich das Alter des Benutzers überprüfen kann, bevor sie entscheiden, ob sie erlauben, zu registrieren. Allerdings muss ich nicht oder wollen sogar ihr Geburtsdatum als Profilinformationen speichern. Wie kann ich dies auf das Anmeldeformular hinzufügen und ihr Alter als Teil des Registrierungsprozesses validieren?
Lösung
Erweitern Sie die integrierte Anmeldeformular das DOB-Feld und ein clean_ Verfahren zur Validierung hinzufügen, dass es bis zu einem bestimmten Zeitpunkt ist. So etwas wie:
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
Ihre Ansichten benutzen Sie DOBRegistrationForm
wie würden Sie den normalen RegistrationForm
. Wenn Sie die registration.views.register
verwenden Sie einfach die Klasse, die als form_class
Parameter übergeben.
So können sie einen Formfehler erhalten, wenn ihre DOB nicht im zulässigen Bereich sind, ohne irgendwelche Zeilen in der Datenbank zu erstellen.
Andere Tipps
Es ist ein kleiner Fehler in rz Antwort, dass es dauert nicht berücksichtigt Schaltjahre.
Wenn jemand am 1. Januar geboren, 1994 die birth Check in rz Antwort erwähnt wird sie berechnen, wie 18 am 28. Dezember seine 2011.
Hier ist eine alternative Version, die Schaltjahre berücksichtigt:
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