es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tiempo redondeado usando wtforms en Python

Estoy usando wtforms en Python, y todo funciona bien, pero quiero redondear el campo de tiempo a solo la hora y mantener los minutos en 00. Por ejemplo, 14:00, 15:00, para que el usuario pueda elegir solo la hora, no los minutos.


Mi forms.py:

    class DateForm(FlaskForm):
        name = StringField("Nombre", validators=[DataRequired()])
        email = StringField("Email", validators=[DataRequired()])
        date = DateField("Fecha", validators=([InputRequired(), DataRequired()]))
        hour = TimeField("Hora", validators=([InputRequired(), DataRequired()]))

submit = SubmitField(“Agendar cita”)

my appointment.html:

     {{ form.csrf_token() }}
     {{ wtf.quick_form(form, novalidate=True, button_map={"submit": "primary"}) }}
      {% with messages = get_flashed_messages() %}
      {% if messages %}
        {% for message in messages %}
         

{{ message }}

{% endfor %} {% endif %} {% endwith %}

Así es como se ve ahora:
enter image description here
¿Cómo puedo lograr esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para redondear el campo de tiempo al siguiente hora más cercana y mantener los minutos en 00, puedes agregar un validador personalizado al campo de tiempo en tu archivo forms.py. Aquí tienes un ejemplo:

    from wtforms import validators
    
    class HourValidator(object):
        def __init__(self, message=None):
            if not message:
                message = 'Por favor, elige una hora válida'
            self.message = message
    
        def __call__(self, form, field):
            if field.data.minute != 0:
                field.data = field.data.replace(minute=0)
            if field.data.second != 0:
                field.data = field.data.replace(second=0)
            if field.data.microsecond != 0:
                field.data = field.data.replace(microsecond=0)
    
    class DateForm(FlaskForm):
        name = StringField("Nombre", validators=[DataRequired()])
        email = StringField("Email", validators=[DataRequired()])
        date = DateField("Fecha", validators=([InputRequired(), DataRequired()]))
        hour = TimeField("Hora", validators=([InputRequired(), HourValidator()]))
        submit = SubmitField("Agendar cita")
    

    El validador HourValidator verifica si la hora seleccionada tiene minutos, segundos o microsegundos, y si es así, reemplaza esos valores por 0. Esto redondea efectivamente el tiempo a la hora más cercana con minutos en 00. Luego puedes agregar HourValidator a los validadores del campo de tiempo en tu formulario.

    Con esta modificación, tu campo de tiempo solo permitirá al usuario elegir horas con minutos en cero, como se muestra a continuación:

    enter image description here

Comments are closed.