我刚刚熟悉 Flask、WTForms(和 Flask-WTF)。我觉得我失去了一些东西。

根据 WTForms 文档 “可以为您生成表单字段 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 等翻译工具包(例如通过 Flask-Babel)。如果您的应用程序通过 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')
    ]
}
.

希望它有所帮助(并解决)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top