Search code examples
pythonformstemplatesmakowtforms

WTForms - display property value instead of HTML field


I want to re-use a template I have with my WTForms form:

<th>${form.name.label}</th>
<td>${form.name()}</td>
...

However, on my edit page, I want the input fields to display as normal (TextField, SelectField, etc.), while on my view page, I want to just display the value of the property, not the input field with the value.

Edit page:

<th>Name:</th>
<td><input type="text" value="Current Name" name="name" id="name"/></td>

View page:

<th>Name:</th>
<td>Current Name</td>

I know I can access a field's value via form.name.data, but is there any way I can keep the same template with form.name() being called and somehow toggle whether that outputs <input type="text"... or Current Name?


Solution

  • I created a custom widget:

    from wtforms.fields import Field
    
    class PlainTextWidget(object):
        def __call__(self, field, **kwargs):
            return field.data if field.data else ''
    

    Then, for my view page, I added the following:

    form = MyForm(obj=myDataRow)
    fields = [val for val in form._fields]
    for fieldName in fields:
        fieldProp = getattr(form, fieldName)
        setattr(fieldProp, 'widget', PlainTextWidget())