我刚刚熟悉 Flask、WTForms(和 Flask-WTF)。我感觉我失去了一些东西。
根据WTForms docs “可以为您生成表单字段 HTML,但我们允许您在模板中对其进行自定义。这使您可以保持代码和表示的分离,并将那些困惑的参数排除在 Python 代码之外。”
对 HTML radio 输入进行建模的建议方法是:
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 模式的角度思考,我认为下拉列表中的选项列表属于模型,而不是 View 。因此,我不会让设计者在模板中定义这些选择。我相信我们同意这一点,对吗?
以您的示例中的形式硬编码选项列表会更好,但它也不理想。想必您有一个 Language
模型或类似的实体,对吗?该模型是有效编程语言选择的权威,因此它应该是向任何人提供有效选择列表的模型,无论是表单还是其他子系统。
正如您在问题中提到的,每个选项都有一个内部名称和一个显示名称。由于我们正在讨论显示字符串,所以我们不要忘记字段的 u'Programming Language'
标题属于显示字符串的同一类别。这些字符串应该由模板设计者负责吗?我不知道,这是模型和演示之间的灰色地带,我认为设计师应该对事物的外观有权威,但对内容没有权威。
如果您想更好地控制这些显示字符串的外观,您可以使用 gettext 等翻译工具包(例如通过 Flask-Babel)。如果您的应用程序通过 gettext 呈现文本,您可以将代码或模板中的任何字符串映射到其他字符串。这用于翻译成其他语言,但您也可以使用它来单独控制字符串如何以应用程序的 native 语言显示。映射是在外部数据文件中完成的,因此我认为这实现了您正在寻找的独立性。
关于python - 使用 WTForms 将表示与逻辑分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22021368/