WTForms support for input readonly attribute?

2020-02-08 14:26发布

Here they say it's not supported out of the box.

Do you know a way to make HTML input form fields use the 'readonly' attribute with WTForms?

4条回答
闹够了就滚
2楼-- · 2020-02-08 15:08

I assume you are talking about the <input readonly> attribute in HTML/XHTML, which is not what that discussion thread you linked is about. (the linked thread is about a lower-level issue with how to ignore passed form input)

The way to set a readonly attribute (and indeed any attribute on a field) is as a keyword-arg in your template. If using Jinja, this looks like (html5):

{{ form.myfield(readonly=true) }}

And for XHTML or versions of WTForms older than 0.6.3:

{{ form.myfield(readonly="readonly") }}

Just note that the 'readonly' attribute is only a hint to the browser, and it has no impact on what the user submits. This is to say, a malicious user (or someone using a browser with custom JS a la greasemonkey or a JS console or a DOM tree) could generate a POST request changing the value of a field regardless of whether the readonly attribute is set on the input tag.

For this reason, the readonly attribute is only useful as an option to modify the user experience (for example, disabling a field based on some event/action using JS) and the input coming from a 'readonly' field is no more trust-able than any other form input.

查看更多
仙女界的扛把子
3楼-- · 2020-02-08 15:14

https://wtforms-components.readthedocs.org/en/latest/#

from wtforms import Form, DateField, TextField
from wtforms_components import TimeField, read_only

class EventForm(Form):
    name = TextField('Name')
    start_date = DateField('Start date')
    start_time = TimeField('Start time')

    def __init__(self, *args, **kwargs):
        super(EventForm, self).__init__(*args, **kwargs)
        read_only(self.name)
查看更多
Lonely孤独者°
4楼-- · 2020-02-08 15:15

The solution is using render_kw in form field declaration.

my_field = fields.StringField('Label', render_kw={'readonly': True})
查看更多
爱情/是我丢掉的垃圾
5楼-- · 2020-02-08 15:24

Another possibility is to use a hidden field, and then in your view, you can print out {{ form.field.data }} to display as text.

查看更多
登录 后发表回答