我只是熟悉Flask,WTForms(和flask-WTF)。我觉得我想念什么。

根据WTForms docs的说法,“您可以为您生成表单字段HTML,但是我们允许您在模板中自定义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 %}


通过这种方法,chooses属性“将(值,标签)对的序列组成”不是将表示与模型混合吗?

是否可以将标签移动到模板并将其与值匹配?

最佳答案

有趣的问题。如果我们考虑MVC模式,那么我认为下拉列表中的选项列表属于模型,而不属于视图。因此,设计人员不会在模板中定义这些选择。我相信我们对此表示同意,对吧?

与您的示例一样,以表单的形式对选项列表进行硬编码会更好,但是也不理想。大概您有一个Language模型或类似实体,对吗?该模型是有效编程语言选择的权威,因此它应该是向任何人(无论是表单还是其他子系统)提供有效选择列表的模型。

正如您在问题中提到的,每个选择都有一个内部名称和一个显示名称。而且,由于我们正在谈论显示字符串,所以请不要忘记您字段的u'Programming Language'标题属于显示字符串的同一类别。这些字符串应该由模板设计者负责吗?我不知道,这是模型和表示之间的灰色区域,我认为设计师应该对事物的外观拥有权限,但对内容没有权限。

如果要对这些显示字符串的外观进行更多控制,可以使用翻译工具包,例如gettext(例如,通过Flask-Babel)。如果您的应用程序通过gettext呈现文本,则可以将代码或模板中的任何字符串映射到其他字符串。这用于翻译成其他语言,但是您也可以使用它来单独控制字符串以应用程序的本机语言显示的方式。映射是在外部数据文件中完成的,因此我认为这可以实现您要查找的独立性。

关于python - 使用WTForms将演示与逻辑分开,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22021368/

10-11 03:33