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.

Cómo convertir un RadioField en un StringField en WTForms.

Dado que es bastante difícil cambiar dinámicamente un WTForm, estoy tratando de renderizar una lista de campos (FieldList) de campos de radio (RadioFields), como si fuera una lista de campos de texto (StringFields). Mi formulario se ve algo así:

class SingleForm(FlaskForm):

    radio = RadioField()


class EntireForm(FlaskForm):

    # lista de formularios simples
    field_forms = FieldList(FormField(SingleForm))

Actualmente estoy renderizando mi código así (botones de radio normales):

<table>
    <tr>
        {% for single_form in form.field_forms %}
            <td>
                {{ single_form.form.radio(required='required') }}
            </td>
        {% endfor %}
    </tr>
</table>

Basado en esta respuesta, he intentado cambiar el tipo de widget de mi formulario en mi routes.py antes de renderizarlo, así:

# esto añade algunos RadioFields del formulario simple al FieldList... 
some_amount_of_fields = 5
for idx in range(some_amount_of_fields):
    form.field_forms.append_entry({})

# ahora cambiamos su tipo de widget...
for single_form in form.field_forms:
    single_form.form.widget = HiddenInput()

Pero esto simplemente no se renderiza en absoluto. ¿Alguna recomendación al respecto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema parece ser que al cambiar el tipo de widget del campo de radio del formulario a HiddenInput() hace que no se renderice en absoluto. Una solución a este problema sería renderizar los botones de radio como etiquetas de input regulares con type="radio", y establecer sus valores en la opción correspondiente para cada campo.

    Para hacer esto, puede modificar su plantilla HTML de la siguiente manera:

    <table>
        <tr>
            {% for single_form in form.field_forms %}
                <td>
                    {% for field in single_form %}
                        {% if field.type == 'RadioField' %}
                            {% for choice in field.choices %}
                                <input type="radio" name="{{ field.name }}" value="{{ choice[0] }}" {%="" if="" field.data="=" choice[0]="" %}="" checked{%="" endif="" %}=""> {{ choice[1] }}<br>
                            {% endfor %}
                        {% else %}
                            {{ field(required='required') }}
                        {% endif %}
                    {% endfor %}
                </td>
            {% endfor %}
        </tr>
    </table>
    

    Esto recorrerá cada campo en cada instancia de SingleForm, y si el campo es un RadioField, renderizará los botones de radio con los atributos name, value y checked apropiados basados en los datos y opciones del campo. De lo contrario, renderizará el campo como de costumbre.

    Tenga en cuenta que esta solución asume que todos los RadioField en el FieldList tienen las mismas opciones. Si este no es el caso, es posible que deba modificar la plantilla para manejar esto.

Comments are closed.