5

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()呼び出して保持し、それが出力するかどうかを何らかの方法で切り替える方法はあります<input type="text"...Current Name?

4

3 に答える 3

7

カスタム ウィジェットを作成しました。

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())
于 2011-06-23T16:26:46.310 に答える
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()

ReadOnly 属性を使用してフィールドを定義します。

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

この問題について考えることで、WTForms がどのように機能するかをよりよく理解することができました。他の誰かが関連する問題を解決するのに役立つかもしれない場合に備えて、これをここに残しておきます。

于 2013-03-25T16:56:52.237 に答える