WTforms でフラスコを使用して、python-eve ベースの API からデータを編集しています。API からこのオブジェクトを取得します (「_id」と「_etag」に注目してください:
{
"_updated": "Sun, 06 Apr 2014 12:49:11 GMT",
"name": "moody",
"question": "how are you?",
"_links": {
"self": {
"href": "127.0.0.1:5000/surveys/533e9f88936aa21dd410d4f1",
"title": "Survey"
},
"parent": {
"href": "127.0.0.1:5000",
"title": "home"
},
"collection": {
"href": "127.0.0.1:5000/surveys",
"title": "surveys"
}
},
"_created": "Fri, 04 Apr 2014 12:03:20 GMT",
"_id": "533e9f88936aa21dd410d4f1",
"_etag": "7d11e7f57ed306043d76c05257474670eccde91c"
}
オブジェクトを WTForm で編集したいので、フォームを作成して定義します。
class surveyForm(Form):
_id = HiddenField("_id")
_etag = HiddenField("_etag")
name = TextField("Name")
question = TextField("question")
submit = SubmitField("Send")
フォームを開始します。
obj = getSurvey(id) # here I get the object from the API
form = surveyForm(**obj)
return render_template('surveyAdd.html', form=form)
フォームをレンダリングします。
<form class="form-horizontal" role="form" action="{{ url_for('surveyAddOrEdit') }}" method=post>
{{ form.hidden_tag() }}
{{ form._id }}
{{ form._etag }}
{{ form.name.label }}
{{ form.name(class="form-control") }}
{{ form.question.label }}
{{ form.question(class="form-control") }}
{{ form.submit(class="btn btn-default") }}
</form>
結果は次のとおりです。
<form class="form-horizontal" role="form" action="/survey/add" method="post">
<div style="display:none;"><input id="csrf_token" name="csrf_token" type="hidden" value="1396959127.36##dc263965e20ecc9956fc25d5b5c96f90f311cf47"></div>
<UnboundField(HiddenField, ('_id',), {})>
<UnboundField(HiddenField, ('_etag',), {})>
<label for="name">Name</label>
<input class="form-control" id="name" name="name" type="text" value="moody">
<label for="question">question</label>
<input class="form-control" id="question" name="question" type="text" value="how are you?">
<input class="btn btn-default" id="submit" name="submit" type="submit" value="Send">
残念なことに...非表示の「_id」フィールドと「_etag」フィールドはレンダリングされません。アンダースコアが縞模様になることに注意してください。これが問題です。
オブジェクトを API から直接フォームにロードし、編集後にそれを直接 API に戻すことができれば最適だと思いますが、uderscores が削除されているためできません。代わりに、オブジェクトを変更し、'_id' を 'id' に、'_etag' を ''etag' に名前変更します。
だから私は2つの質問があります:
- オブジェクトを変更せずに直接フォームに入れる方法はありますか
- API と対話するための推奨される方法は何ですか。オブジェクトをロードしてサニタイズするクライアント側のメソッドを用意したほうがよいですか?
乾杯!