使用WTForms将逻辑与逻辑分开

时间:2014-02-25 17:13:11

标签: python flask wtforms flask-wtforms

我只是熟悉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 %}

使用这种方法,不是选择属性“这是一个(值,标签)对的序列”将表示与模型混合在一起吗?

是一种将标签移动到模板并将其与值匹配的方法吗?

3 个答案:

答案 0 :(得分:1)

从纯粹的理论角度来看,似乎并不是一个好主意。如果必须将标签与模板中的实际值相关联,那么这意味着在模板中有一个业务逻辑。

此外,您如何设想确切的代码呢?它需要在语句中分配标签的子字段上下文。我无法想象代码在模板中看起来很好。它应该是表示逻辑的一部分吗?

答案 1 :(得分:1)

有趣的问题。如果我们根据MVC模式进行思考,我认为下拉列表中的选项列表属于模型,而不属于视图。所以我不会在模板中由设计者定义这些选择。我相信我们同意这一点,对吗?

在示例中使用硬编码的选项列表更好,但它也不理想。大概你有一个Language模型或类似的实体,对吗?该模型是有效编程语言选择的权威,因此它应该是向任何人提供有效选择列表的模型,无论是表单还是其他子系统。

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

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

答案 2 :(得分:0)

这是我提出的解决方案(以保持分离)。这可能有点矫枉过正,但我​​会试一试,看看它是如何扩展的。

在forms.py中:

import sys
sys.path.append("templates")
import constants

class ExmapleForm(Form):
    language = RadioField('language', choices=constants.languages['choices'], validators=constants.languages['validators'])

然后我在templates文件夹中创建了一个名为constants.py的文件:

from wtforms.validators import InputRequired

languages = {
    'choices': [
        ('py', 'Python'),
        ('js', 'JavaScript')
    ],
    'validators': [
        InputRequired(message = 'Please Select')
    ]
}

希望它有所帮助(并制定出来)