【问题标题】:WTForms - display property value instead of HTML fieldWTForms - 显示属性值而不是 HTML 字段
【发布时间】:2011-09-21 08:30:02
【问题描述】:

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

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

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

编辑页面:

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

查看页面:

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

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

【问题讨论】:

    标签: python forms templates mako wtforms


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      Sarah 的上述回答让我找到了一个相关问题的解决方案:如果您希望某些字段为只读,该怎么办?在这种情况下,您可以定义一个新的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()
      

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

      class UserPrefs(Form):
          name     = ROTextField('name', default='Jon')
          # ...
      

      思考这个问题有助于我更好地理解 WTForms 的工作原理。将其留在这里以防这可能有助于其他人解决相关问题。

      【讨论】:

        【解决方案3】:

        根据 WTForms-Components 中 Sarah 的回答和代码,我使用以下方法快速将表单的所有字段转换为只读和禁用字段。

        假设我们有一个 ProfileForm 定义如下:

        class ProfileEditForm(Form):
            title = StringField("Title", validators=[validators.required("Please enter your title.")])
            first_name = StringField("First Name", validators=[validators.required("Please enter your first name.")])
            middle_name = StringField("Middle Name")
            last_name = StringField("Last Name", validators=[validators.required("Please enter your last name.")])
            organisation = StringField("Company Name", validators=[validators.required("Please enter your company name.")])
            organisation_website = StringField("Company Website")
            # more fields ...
        

        定义以下类(基于 WTForms-Components 中的 ReadOnlyWidgetProxy):

        class ReadOnlyAndDisabledWidgetProxy(object):
            def __init__(self, widget):
                self.widget = widget
        
            def __getattr__(self, name):
                return getattr(self.widget, name)
        
            def __call__(self, field, **kwargs):
                kwargs.setdefault('readonly', True)
                kwargs.setdefault('disabled', True)
                return self.widget(field, **kwargs)
        

        现在从 ProfileForm 继承如下:

        class ReadOnlyProfileForm(ProfileForm):
            def __init__(self, *args, **kwargs):
                super(ReadOnlyProfileForm, self).__init__(*args, **kwargs)
                for field_name in self._fields:
                    field_property = getattr(self, field_name)
                    field_property.widget = ReadOnlyAndDisabledWidgetProxy(field_property.widget)
        

        【讨论】:

          猜你喜欢
          • 2021-10-03
          • 1970-01-01
          • 2015-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-20
          相关资源
          最近更新 更多