Cómo subclasificar el formulario de registro en django-registration
-
20-12-2019 - |
Pregunta
Deseo que el usuario acepte los TOS y también admita correos electrónicos únicos.django-registration tiene dos formularios de registro con subclases diferentes que hacen esto: RegistrationFormTermsOfService
y RegistrationFormUniqueEmail
.
¿Tengo que crear mi propia subclase de RegistrationForm y luego proporcionar ambas funciones?Si es así, ¿cómo se lograría esto?¿El formulario de registro viviría dentro del formulario Forms.py de mi aplicación o en algún otro lugar?
Solución
Una mirada rápida a la fuente para las dos clases muestra:
class RegistrationFormTermsOfService(RegistrationForm):
"""
Subclass of ``RegistrationForm`` which adds a required checkbox
for agreeing to a site's Terms of Service.
"""
tos = forms.BooleanField(widget=forms.CheckboxInput,
label=_(u'I have read and agree to the Terms of Service'),
error_messages={'required': _("You must agree to the terms to register")})
class RegistrationFormUniqueEmail(RegistrationForm):
"""
Subclass of ``RegistrationForm`` which enforces uniqueness of
email addresses.
"""
def clean_email(self):
"""
Validate that the supplied email address is unique for the
site.
"""
if User.objects.filter(email__iexact=self.cleaned_data['email']):
raise forms.ValidationError(_("This email address is already in use. Please supply a different email address."))
return self.cleaned_data['email']
Como puede ver, estas dos clases no sobrescriben los métodos definidos por la otra, por lo que debería poder definir su propia clase como:
from registration.forms import RegistrationFormUniqueEmail, RegistrationFormTermsOfService
class RegistrationFormTOSAndEmail(RegistrationFormUniqueEmail, RegistrationFormTermsOfService):
pass
Y debería funcionar, sin embargo, no lo he probado.En cuanto a dónde colocar esta clase; forms.py
es una buena ubicación.
Actualizar:
Un poco de lectura en https://django-registration.readthedocs.org/en/latest/views.html lo que nos dice que podemos pasarle a la vista algunos parámetros a través de la definición de la URL;por ejemplo, una clase de formulario.Simplemente use una URL como:
url(r'^register/$',
RegistrationView.as_view(form_class=RegistrationFormTOSAndEmail),
name='registration_register')