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

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

for error in form.username.errors:
        print error

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

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

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

【问题讨论】:

    标签: python flask wtforms


    【解决方案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 %}
        

        【讨论】:

          猜你喜欢
          • 2020-10-03
          • 1970-01-01
          • 2011-05-02
          • 2020-06-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-30
          • 2016-06-20
          • 1970-01-01
          相关资源
          最近更新 更多