web-dev-qa-db-ja.com

WTFormsは入力読み取り専用属性をサポートしていますか?

ここでは、そのままではサポートされていないと言われています。

HTML入力フォームフィールドにWTFormsで「読み取り専用」属性を使用させる方法を知っていますか?

19
casual

HTML/XHTMLの<input readonly>属性について話していると思いますが、これはリンクしたディスカッションスレッドの内容ではありません。 (リンクされたスレッドは、渡されたフォーム入力を無視する方法に関する低レベルの問題に関するものです)

読み取り専用属性(および実際にはフィールド上の任意の属性)を設定する方法は、テンプレートのkeyword-argとしてです。 Jinjaを使用している場合、これは(html5)のようになります。

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

また、XHTMLまたは0.6.3より古いバージョンのWTFormsの場合:

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

'readonly'属性はブラウザへのヒントにすぎず、ユーザーが送信する内容には影響しないことに注意してください。つまり、悪意のあるユーザー(またはカスタムJS a laグリースモンキーまたはJSコンソールまたはDOMツリーを備えたブラウザーを使用しているユーザー)は、フィールドの値を変更するPOSTリクエストを生成する可能性があります。読み取り専用属性が入力タグに設定されているかどうか。

このため、読み取り専用属性は、ユーザーエクスペリエンスを変更するオプションとしてのみ役立ち(たとえば、JSを使用してイベント/アクションに基づいてフィールドを無効にする)、「読み取り専用」フィールドからの入力は信頼できなくなります。他のどのフォーム入力よりも。

22
Crast

解決策は、フォームフィールド宣言でrender_kwを使用することです。

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

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)
4
0xd3

もう1つの可能性は、非表示フィールドを使用することです。次に、ビューで{{ form.field.data }}を印刷してテキストとして表示できます。

0
Scott