python - 使用 WTForms 将表示与逻辑分开

标签 python flask wtforms flask-wtforms

我刚刚熟悉 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/

相关文章:

python - 在 Flask 应用程序中设置和检索环境变量

javascript - WTForms-Javascript : pass onclick to WTF field

python - 缓存访问被拒绝。请求模块中需要身份验证

python - 从列表中制作字典并分成两部分

python - 如何在python中将24色bmp图像转换为16色bmp

python - 获取请求后坚持WTForm QuerySelectField值

javascript - 添加 jQuery 脚本后输入字段(使用 wtforms 创建)中断

python - python中的确定性递归散列

python - celery / flask ;从开发到生产

python - 卡在 Flask 教程步骤 5 "initdb"无法识别