WTForms - 显示属性值而不是HTML字段

Sar*_*els 5 python forms templates mako wtforms

我想重新使用我的WTForms表单模板:

<th>${form.name.label}</th>
<td>${form.name()}</td>
...
Run Code Online (Sandbox Code Playgroud)

但是,在我的编辑页面上,我希望输入字段显示为正常(TextField,SelectField等),而在我的视图页面上,我只想显示属性的值,而不是带有值的输入字段.

编辑页面:

<th>Name:</th>
<td><input type="text" value="Current Name" name="name" id="name"/></td>
Run Code Online (Sandbox Code Playgroud)

查看页面:

<th>Name:</th>
<td>Current Name</td>
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过访问字段的值form.name.data,但是有什么方法可以保持相同的模板form.name()被调用并以某种方式切换是否输出<input type="text"...Current Name

Sar*_*els 6

我创建了一个自定义小部件

from wtforms.fields import Field

class PlainTextWidget(object):
    def __call__(self, field, **kwargs):
        return field.data if field.data else ''
Run Code Online (Sandbox Code Playgroud)

然后,对于我的视图页面,我添加了以下内容:

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


Jon*_*ice 5

上面莎拉的回答让我找到了一个相关问题的解决方案:如果您希望某些字段为只读怎么办?在这种情况下,您可以定义一个新ROTextField变体(例如),而不是对表单对象进行运行时手术,它始终呈现为纯值。例如:

from wtforms.widgets import Input
from wtforms.fields import StringField

class TextOutput(Input):
    def __call__(self, field, **kwargs):
        return kwargs.get('value', field._value())

class ROTextField(StringField):
    widget = TextOutput()
Run Code Online (Sandbox Code Playgroud)

现在使用 ReadOnly 属性定义您的字段:

class UserPrefs(Form):
    name     = ROTextField('name', default='Jon')
    # ...
Run Code Online (Sandbox Code Playgroud)

思考这个问题帮助我更好地理解了 WTForms 是如何工作的。留在这里以防万一这可能有助于其他人解决相关问题。