WTFORMSでロジックからの別のプレゼンテーション
-
21-12-2019 - |
質問
フラスコ、WTFORMS(およびFLASK-WTF)で慣れるだけです。私は何かが足りないように感じます。
wtforms docs "あなたのフォームフィールドHTMLはあなたのために生成されましたが、あなたはあなたのテンプレートでそれをカスタマイズさせます。これにより、コードとプレゼンテーションの分離を維持し、それらの乱雑なパラメータをあなたのPythonコードから維持することができます。 "
HTMLラジオ入力をモデル化する方法は次のとおりです。
class ExmapleForm(Form):
language = RadioField(u'Programming Language', choices=[('py', 'Python'), ('js', 'JavaScript')])
.
....テンプレートの推奨される方法HTMLラジオ入力は次のとおりです。
{% for subfield in form.radio %}
<tr>
<td>{{ subfield }}</td>
<td>{{ subfield.label }}</td>
</tr>
{% endfor %}
.
このアプローチでは、選択された(値、ラベル)ペアのシーケンスである選択プロパティではありません。
は、ラベルをテンプレートに移動させ、その値と一致させる方法です。
解決
興味深い質問。 MVCパターンの観点から考えると、ドロップダウンに入る選択肢のリストが表示されていないモデルに属しています。そのため、テンプレートのデザイナーによってこれらの選択肢が定義されていません。私たちはこれについて同意すると信じていますか?
あなたの例のような形式で覆われている選択肢のリストを持つことは優れていますが、理想的ではありません。おそらくあなたはLanguage
モデルまたは類似のエンティティを持っていますか?そのモデルは有効なプログラミング言語の選択の権限であるため、誰かに有効な選択肢のリストを提供するもの、フォームまたはその他のサブシステムです。
あなたの質問で言及しているように、それぞれの選択は内部名と表示名を持ちます。また、ディスプレイ文字列について話しているので、フィールドのu'Programming Language'
タイトルが表示文字列の同じカテゴリに入ることを忘れません。これらの文字列はテンプレートデザイナーの責任になりますか?私は知りません、これはモデルとプレゼンテーションの間の灰色の領域です、私はデザイナーが物事の外観についての権威を持っているべきだと思いますが、コンテンツにはありません。
これらの表示文字列の外観をより多くのコントロールしたい場合は、GetTextなどの翻訳ツールキット(たとえば、フラスコババーを介して)を使用できます。アプリケーションがGetTextを介してテキストをレンダリングした場合は、コードまたはテンプレートから他の文字列への文字列をマッピングできます。これは他の言語に翻訳するために使用されますが、アプリケーションの母国語に文字列が表示される方法を個別に制御するために使用することもできます。マッピングは外部データファイルで行われますので、これはあなたが探している独立性を達成すると思います。
他のヒント
純粋に理論的な観点から見ていないことは良い考えではないようです。テンプレート内の実際の値でラベルを接続しなければならない場合は、テンプレートにビジネスロジックを持つことを意味します。
さらに、それを行っている正確なコードをどのように想像しますか?ラベルを割り当てるステートメント内のサブフィールドコンテキストが必要になります。このコードがテンプレートでよく見えていると想像できません。そしてそれはそれがそれがそうでなければならないのでプレゼンテーションロジックの一部になるでしょうか?
これは私が思いついた解決策(分離を維持するために)。それはオーバーキルかもしれませんが、私はそれを試してみて、それがどのようにスケールをするかを見るつもりです。
Forms.py:
import sys
sys.path.append("templates")
import constants
class ExmapleForm(Form):
language = RadioField('language', choices=constants.languages['choices'], validators=constants.languages['validators'])
.
それから私はconstants.pyというテンプレートフォルダにファイルを作成しました:
from wtforms.validators import InputRequired
languages = {
'choices': [
('py', 'Python'),
('js', 'JavaScript')
],
'validators': [
InputRequired(message = 'Please Select')
]
}
.
それが助けることを願って