【问题标题】:Linking errors to the right field in WTForms FieldLists将错误链接到 WTForms FieldLists 中的正确字段
【发布时间】:2012-07-19 18:03:37
【问题描述】:

我正在使用 WTForm 验证我直接从 javascript 模型提交的表单(通过剔除填充)。在我的表格中,我有一个可以动态添加/删除的银行账户列表。在 python 方面,我有这样的东西:

class Account(Form):
    acc_name        = TextField('Account', [validators.Length(min=2, max=35)])    

class InformationForm(Form):
    account_list = FieldList(FormField(Account))

接收到的用于验证的 json 数据如下:

'account_list': [{'acc_name': 'aaaaa'}, {'acc_name': 'b'}]}

问题是,当我验证时收到类似这样的信息,无法知道列表中的哪个帐户是错误的来源:

'account_list': [{'acc_name': [u'Field must be between 2 and 35 characters long.']}

如何将错误链接到正确的帐户?

编辑:我最终的做法是在我的 InformationForm 类中添加了一个 getErrors 方法,该方法为每个 Account 构建了一个由唯一 Id 索引的字典,其中值是每个 Account错误。然后我将它作为 json 返回到我的应用程序。如果有一个“自然”的解决方案,我会保持这个问题......

【问题讨论】:

  • 您能否提供指向您的getErrors 实施的链接?我不相信 WTForms 本身有办法做到这一点。我希望它会返回一个像[None, ["first error on second element", "second error on second element"], None] 这样的错误列表。
  • 我为此开了一个GitHub issue

标签: python ajax wtforms fieldlist


【解决方案1】:

FieldList 中的每个单独元素本身就是一个字段。如果 FieldList 包含一个 TextField,则每个条目都是一个 TextField。如果它包含一个 FormField,那么它就是一个 FormField(然后它包含一个带有自己的字段的表单) FieldList 条目可以通过迭代 FieldList 或访问 FieldList 的 .entries 属性来访问。

因此,与其查看form.account_list.errors,不如查看封闭字段的错误。

所以为了你的使用,像这样:

{% for subfield in form.account_list %}
    <!-- subfield in this case is an instance of FormField -->
    {{ subfield.form.acc_name() %}
    {% if subfield.errors %}
        {% for error in subfield.form.acc_name.errors %}
            <p class="error">{{ error }}</p>
        {% endfor %}
    {% endif %}
{% endfor %}

如果您需要始终如一且经常这样做,您可能希望abstract this out to a macro 而不是为每个专业领域设置都这样做。

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多