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?
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 deinput
regulares contype="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:
Esto recorrerá cada campo en cada instancia de
SingleForm
, y si el campo es unRadioField
, renderizará los botones de radio con los atributosname
,value
ychecked
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 elFieldList
tienen las mismas opciones. Si este no es el caso, es posible que deba modificar la plantilla para manejar esto.