WTForms是否支持输入readonly属性?

27
4个回答

43

解决方案是在表单字段声明中使用render_kw

my_field = fields.StringField('Label', render_kw={'readonly': True})

3
如果你想从Jinja2访问它,可以这样做:{% if form.my_field.render_kw.readonly } readonly blabla {% endif %}提示:以上代码片段为Python的Jinja2模板语言。其中,if语句判断了表单组件(form)中名为my_field的字段(field)的渲染关键词(render_kw)中是否包含只读属性(readonly)。如果包含,则输出只读属性的内容(blabla)。 - techniao
太好了!这让我可以在我的forms.py中声明它,然后使用Bootstrap渲染表单。 - Jeff Bluemel
特别喜欢这样做:https://getbootstrap.com/docs/4.0/components/forms/#readonly-plain-text - fearless_fool

29
我假设您在谈论HTML/XHTML中的<input readonly>属性,这与您链接的讨论主题不同(该链接的主题是如何忽略传递的表单输入的较低级问题)。
设置只读属性(以及字段上的任何属性)的方法是在模板中作为关键字参数。如果使用Jinja,则如下所示(html5):
{{ form.myfield(readonly=true) }}

对于XHTML或WTForms 0.6.3之前的版本:

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

请注意,'readonly'属性仅是对浏览器的提示,对用户提交的内容没有影响。这意味着,一个恶意用户(或者使用带有自定义JS的浏览器,例如Greasemonkey或JS控制台或DOM树)可以生成一个POST请求来更改字段的值,而不管输入标记上是否设置了'readonly'属性。

因此,readonly属性只有作为修改用户体验的选项时才有用(例如,使用JS基于某些事件/操作禁用字段),而来自“只读”字段的输入与任何其他表单输入一样不可信赖。


19
当你声明表单时,似乎有点傻,你不能将它们作为kwargs传递给小部件或其他东西。 - coleifer
@coleifer,实际上你可以这样做,尤其是对于StringFields,但不幸的是对于BooleanFields来说,在浏览器级别上只被视为提示。在wtforms级别传递render_kw={'readonly': True}以应用只读属性,如上面的领先答案所述。 (我只是添加了这个评论,因为你的回答得到了很多赞)。 - CodeMantle

4

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)

3
另一种可能性是使用隐藏字段,然后在您的视图中,您可以打印{{ form.field.data }}以显示为文本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接