WTForms 得到错误

Posted

技术标签:

【中文标题】WTForms 得到错误【英文标题】:WTForms getting the errors 【发布时间】:2011-09-21 17:24:46 【问题描述】:

目前在 WTForms 中要访问错误,您必须像这样遍历字段错误:

for error in form.username.errors:
        print error

由于我正在构建一个不使用表单视图的 rest 应用程序,因此我不得不检查所有表单字段以找出错误所在。

有没有办法可以做类似的事情:

for fieldName, errorMessage in form.errors:
        ...do something

【问题讨论】:

【参考方案1】:

使用SqlAlchemy 中的ModelFormFieldsWTForms 一起使用时,如果对象内部有嵌套对象(外键关系),以下是正确显示字段相关错误的方法。

Python 方面:

def flash_errors(form):
    for field, errors in form.errors.items():
        if type(form[field]) == ModelFormField:
            for error, lines in errors.iteritems():
                description = "\n".join(lines)
                flash(u"Error in the %s field - %s" % (
                    #getattr(form, field).label.text + " " + error,
                    form[field][error].label.text,
                    description
                ))
        else:
            for error, lines in errors.iteritems():
                description = "\n".join(lines)
                flash(u"Error in the %s field - %s" % (
                    #getattr(form, field).label.text + " " + error,
                    form[field].label.text,
                    description
                ))

神社方面:

  % with messages = get_flashed_messages(with_categories=true) %
    % for message in messages %
      % if "Error" not in message[1]: %
        <div class="alert alert-info">
          <strong>Success! </strong>  message[1] 
        </div>
      % endif %

      % if "Error" in message[1]: %
        <div class="alert alert-warning">
          message[1] 
        </div>
      % endif %
    % endfor %
  % endwith %

希望对您有所帮助。

【讨论】:

【参考方案2】:

实际的form 对象有一个errors 属性,其中包含字典中的字段名称及其错误。所以你可以这样做:

for fieldName, errorMessages in form.errors.items():
    for err in errorMessages:
        # do something with your errorMessages for fieldName

【讨论】:

【参考方案3】:

更简洁的 Flask 模板解决方案:

Python 3:

% for field, errors in form.errors.items() %
<div class="alert alert-error">
     form[field].label :  ', '.join(errors) 
</div>
% endfor %

Python 2:

% for field, errors in form.errors.iteritems() %
<div class="alert alert-error">
     form[field].label :  ', '.join(errors) 
</div>
% endfor %

【讨论】:

这是此页面上的最大努力。但看起来有人在我的表格上胡扯。还公开了表单名称,以便我的最终用户弄清楚 cli_tel 实际上是什么......虽然我可能是唯一关心的人? @PeterLada:那是愚蠢的事情......错误变量并没有真正提供。我认为你可以这样做:form[field].name 如果你使用python3,使用items()而不是iteritems() 而不是只使用label。使用label.text。即:flash(''.join([f'form[f].label.text: "".join(e) ' for f, e in form.errors.items()]))。删除 html【参考方案4】:

对于希望在 Flask 模板中执行此操作的任何人:

% for field in form.errors %
% for error in form.errors[field] %
    <div class="alert alert-error">
        <strong>Error!</strong> error
    </div>
% endfor %
% endfor %

【讨论】:

以上是关于WTForms 得到错误的主要内容,如果未能解决你的问题,请参考以下文章

在 wtforms 中打印 form.validate_on_submit() 时我得到 False 并且我也设置了密钥

当我将 POST 与 Flask 一起使用时,我遇到了 wtforms 选择字段的问题

wtforms Form实例化流程(源码解析)

wtforms Form实例化流程(源码解析)

WTForms 以 unicode 格式从表单中引入数据

不是动态选择字段 WTFORMS 的有效选择