为什么输入验证器 IPAddress、Length 不向用户提供任何错误消息,而只是阻止他提交按钮?

Why input validators IPAddress, Length do not provide user any error message, but just prevent him from submitting button?

需要有关 WTForms Flask 的建议:我需要使用 ip 地址验证器和最大长度验证器(IPAddress、Length)- 它们可以工作,但不会给用户任何错误消息,另一方面,InputRequired 验证器可以正常工作。我检查了文档,不知道代码可能有什么问题。

// app.py 文件:

    from flask import Flask, render_template
    from flask_wtf import FlaskForm
    from wtforms import StringField, SubmitField
    from wtforms.validators import InputRequired, IPAddress, Length


    app = Flask(__name__)
    app.secret_key = "test"

    StringField()

    class MyForm(FlaskForm):
       inp_required_str = StringField("Input required: ", validators= 
       [InputRequired()])
       max_len_str = StringField("Max length < 5: ", validators= 
       [InputRequired(), Length(max=5, message="Less than 5!")])
       ip_address_str = StringField("Is ip address: ", validators= 
       [InputRequired(), IPAddress(message="Should be ip!")])
       button = SubmitField("Click me!")


     @app.route('/', methods=["GET", "POST"])
     def hello_world():
        form = MyForm()
        if form.validate_on_submit():
            # do some work here
            return render_template("test.html", form=form, message="Fine?")
        return render_template("test.html", form=form)


   if __name__ == '__main__':
        app.run()

// html 模板:

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Test</title>
    </head>
    <body>
        <form method="post">
            {{ form.hidden_tag() }}
            {{form.inp_required_str.label}}  {{form.inp_required_str}} <br> 
            <br>
            {{form.max_len_str.label}}  {{form.max_len_str}} <br> <br>
            {{form.ip_address_str.label}}  {{form.ip_address_str}} <br> <br>
            {{form.button}} <br> <br>
        </form>
        <h1>{{ message }}</h1>

    </body>
    </html>

您没有呈现通过调用 validate_on_submit 返回的错误消息。您需要添加某种逻辑来为您执行此操作。 InputRequired 验证器工作正常,因为 Wtforms 向您的输入字段添加了一个必需的属性,并且由浏览器本身管理。

我建议您使用宏 here:

{% macro render_field(field) %}
  <dt>{{ field.label }}
  <dd>{{ field(**kwargs)|safe }}
  {% if field.errors %}
    <ul class=errors>
    {% for error in field.errors %}
      <li>{{ error }}</li>
    {% endfor %}
    </ul>
  {% endif %}
  </dd>
{% endmacro %}