La validación de mi formulario está casi terminada, solo tengo 2 casos que no sé exactamente cómo resolver: 1) El campo de contraseña debe ser requerido por supuesto, pero también brindo la posibilidad de iniciar sesión con la cuenta de google o facebook a través de OAuth y después el nombre se llena previamente pero me quite el campo de la contraseña por completo de la forma es que hay un usuario (Google) o un objeto de usuario de Facebook:¿Cómo hacer un campo condicionalmente opcional en WTForms?
<tr><td>
<br /> {% if user or current_user %} {% else %}
<div class="labelform">
{% filter capitalize %}{% trans %}password{% endtrans %}{% endfilter %}:
</div>
</td><td> <div class="adinput">{{ form.password|safe }}{% trans %}Choose a password{% endtrans %}</div>{% endif %}
</td></tr>
Así que para estos usuarios que ya han iniciado sesión en el campo de contraseña no tiene sentido, necesito un poco de lógica para hacer que ese campo sea condicionalmente opcional. Estaba pensando que podría tener una variable de logged_in + un método en mi clase de la forma como este:
class AdForm(Form):
logged_in = False
my_choices = [('1', _('VEHICLES')), ('2', _('Cars')), ('3', _('Bicycles'))]
name = TextField(_('Name'), [validators.Required(message=_('Name is required'))], widget=MyTextInput())
title = TextField(_('title'), [validators.Required(message=_('Subject is required'))], widget=MyTextInput())
text = TextAreaField(_('Text'),[validators.Required(message=_('Text is required'))], widget=MyTextArea())
phonenumber = TextField(_('Phone number'))
phoneview = BooleanField(_('Display phone number on site'))
price = TextField(_('Price'),[validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),validators.Optional()])
password = PasswordField(_('Password'),[validators.Optional()], widget=PasswordInput())
email = TextField(_('Email'), [validators.Required(message=_('Email is required')), validators.Email(message=_('Your email is invalid'))], widget=MyTextInput())
category = SelectField(choices = my_choices, default = '1')
def validate_name(form, field):
if len(field.data) > 50:
raise ValidationError(_('Name must be less than 50 characters'))
def validate_email(form, field):
if len(field.data) > 60:
raise ValidationError(_('Email must be less than 60 characters'))
def validate_price(form, field):
if len(field.data) > 8:
raise ValidationError(_('Price must be less than 9 integers'))
def validate_password(form, field):
if not logged_in and not field:
raise ValidationError(_('Password is required'))
¿Funcionará validate_password anterior para lograr el efecto deseado? ¿Hay alguna otra forma mejor? Otra forma de lo que podía pensar es tener 2 diferentes clases de formulario y en http post que instanciar la clase de formulario que debe ser:
def post(self):
if not current_user:
form = AdForm(self.request.params)
if current_user:
form = AdUserForm(self.request.params)
También necesito la validación condicional para el campo de categoría, cuando una determinada categoría se selecciona a continuación más aparecen las opciones y estas deben tener validación solo para una cierta categoría base, por ej. el usuario selecciona "Coche" y luego a través de Ajax puede elegir los datos de registro y el kilometraje del automóvil y estos campos son obligatorios dado que se seleccionó la categoría Coche.
Así que pueden ser dos preguntas, pero ambos casos se relacionan con cómo puedo hacer que un campo sea "condicionalmente opcional" o "condicionalmente requerido".
Mi forma se parece a esto
Y para un usuario conectado I pre-rellenar el nombre y dirección de correo electrónico y el campo pasword simplemente no se utiliza, por lo que el campo de contraseña no se ajusta a ser "opcional" ni "requerido", necesitaría algo como "condicionalmente opcional" o "condicionalmente requerido".
Gracias por cualquier respuesta o comentario
¿Cuál es la licencia para usar su fragmento de código? –
@Mehdi: http://meta.stackexchange.com/questions/12527/do-i-have-to-worry-about-copyright-issues-for-code-posted-on-stack-overflow – brandones
Awesome³! Funciona muy bien! – Roman